`
tomhibolu
  • 浏览: 1431033 次
文章分类
社区版块
存档分类
最新评论

kernel hacker修炼之道之调度器与时间系统-PID 哈希表

 
阅读更多

浅析linux内核调度器与时间系统之PID 哈希表

作者:李万鹏


首先看一下kernel中的哈希表的数据结构,哈希表头:

链表头是hlist_head,注意这是一个双向链表但不循环。first字段指向第一个节点。

哈希表节点:

这里的next指向下一个节点,pprev字段存放了上一个next字段的地址。即*(second->pprev) = = first->next。


内核中经常需要通过进程的PID来获得进程描述符task_struct,顺序扫描进程链表并检查进程描述符的pid字段是可行但相当低效的。为了加速查找引入4个散列表,因为进程包含了表示不同类型的PID的字段,而且每个字段需要它自己的散列表。


4个散列表和进程描述符中的相关字段:

Hash表的类型 字段名 说明

PIDTYPE_PID pid 进程的PID

PIDTYPE_TGID tgid 线程组领头进程的PID

PIDTYPE_PGID pgrp 进程组领头进程的PID

PIDTYPE_SID session 会话领头进程的PID


内核初始化期间为4个散列表分配空间,并把它们的地址存入pid_hash数组。在start_kernel函数中调用了pidhash_init:

pidhash_shift是表索引的长度,注意这里有个printk,我系统启动的打印信息有这么一行:

说明我系统的pidhash_shift为12,这个值依赖于系统RAM的大小。例如:一个拥有512MB的RAM,每个散列表拥有4个页框,可以拥有2048个表项。pidhash_init函数中使用alloc_bootmem分配器为散列表分配内存(这是alloc_page,slab还未初始化),pid_hash的第一维是散列表,第二维是每个散列表中的散列地址。每个地址会对应一个链表,所以这里初始化链表头,如下图:


PIDTYPE_MAX就是散列表的个数,在pid.h中有一个枚举:

用pid_hashfn宏把PID转化为表索引,即哈希地址:

在32位体系结构中hash_long等价于:

这里我们使pidhash_shift为11,这样表索引的范围为0~2047,hash_long相当于(pid*0x9e370001)>>21。PID从0~32767会产生冲突,这里解决冲突的方法就是使用链表。如上图,PID号为199的和PID为29384的进程产生了冲突,被链在同一个哈希地址的链表上。

(199*0x9e370001)>>21 = 199,(29384*0x9e370001)>>21 = 199。

下面来看一下task_struct的pid字段,在task_struct中有:

nr是进程的PID,pid_chain是将发生冲突的pid链在这个pid_chain链表上,pid_list字段是同一个线程组,会话组或进程组的链接在pid_list链表上,如下图:


这个图里,PID为246的和PID为4351的pid发成冲突,所以链接在pid_chain链表上。同一个线程组的PID为4351的三个进程链接到pid_list上。




分享到:
评论

相关推荐

    Linux常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...

    常见驱动源码分析(kernel hacker修炼之道)-李万鹏

    这本书是“Linux kernel hacker修炼之道”的一部分,通过深入剖析各种常见的驱动源码,帮助读者提升在Linux系统中的驱动开发能力。 在Linux操作系统中,驱动程序是连接硬件与内核的桥梁,它们负责管理和控制硬件...

    常见驱动源码分析(kernel hacker修炼之道)

    《常见驱动源码分析(kernel hacker修炼之道)》这本书或课程很可能深入探讨了如何理解和编写这些驱动,旨在帮助开发者提升对Linux内核和驱动编程的理解。在这个过程中,我们将会涉及到几个关键的知识点: 1. **Linux...

    linux kernel修炼之道

    如果刚刚对linux的kernel有兴趣,想了解点什么的话,请先看看此书吧,她风趣幽默的介绍了linux的发展趣事,让你开心快乐之余慢慢领会linux的魅力,让你了解学习掌握kernel的方法。其中的很多建议经过我的实践和摸索...

    Linux内核驱动笔记

    Linux内核驱动是操作系统的核心组件,负责管理硬件设备与CPU之间的通信。驱动程序允许操作系统通过统一的接口来访问硬件设备,而无需关心硬件的物理细节。在Linux系统中,驱动程序通常被划分为内核空间和用户空间两...

    hacker成长之道

    有关hacker 的文章和资料分享给大家

    processhacker-2.39-bin

    ProcessHacker是一款强大的系统信息工具,它提供了进程管理、服务管理、硬件监控、内存查看等多种功能,深受系统...通过下载并使用"processhacker-2.39-bin"压缩包,你将能够亲身体验这些功能并提升你的系统管理技能。

    进程黑客(Process Hacker)Processhacker-3.0.4132

    Process Hacker是一款针对高级用户的安全分析工具,它可以帮助研究人员检测和解决软件或进程在特定操作系统环境下遇到的问题。除此之外,它还可以检测恶意进程,并告知我们这些恶意进程想要实现的功能。 Process ...

    Resource Hacker - 版本 3.4.0

    对话,菜单,字符串表,加速器和消息表资源脚本 (以及 Borland 窗体) 可以通过使用内部资源脚本编辑器被编辑和重新编译。 资源也可以被一个 *.res 文件所替换,只要替换的资源与它是同一类型并且有相同的名称。 4. ...

    Laravel开发-hackerrank-api

    在本项目中,“Laravel开发-hackerrank-api”是一个基于 Laravel 框架构建的 API,用于与 Hackerrank 的代码检查器进行交互。Laravel 是一个流行的、优雅的 PHP 开发框架,它提供了丰富的工具和功能,使得开发者能够...

    HackerRank-Algorithms,.zip

    《HackerRank算法挑战解析与实战》 HackerRank是一个全球知名的在线编程竞赛平台,它提供了丰富的算法挑战,旨在帮助开发者提升编程技能、算法理解和问题解决能力。这个名为"HackerRank-Algorithms"的开源项目,...

    processhacker-2.39-bin.rar

    Process Hacker是一款强大的系统进程管理工具,并且还可以显示CPU、GPU、IO、内存等相关使用信息。 官网地址:https://processhacker.sourceforge.io/ git地址:https://github.com/processhacker/processhacker

    Algorithm-HackerRank-Solutions-In-Scala.zip

    总之,结合HackerRank的算法挑战与Scala语言,开发者可以锻炼编程思维,提升代码质量,更好地应对实际开发中的复杂问题。这个压缩包为你提供了一个宝贵的实践和学习资源,助你在算法的道路上不断进步。

    The-hacker-playbook3最新版PDF

    The-hacker-playbook3最新版PDF,从某安全群里面分享得到,同步共享给大家

    hackerrank题目解答

    Hackerrank是一个全球性的技术招聘平台,它通过一系列的编程挑战和练习来帮助求职者在编码方面提高技能并为职场做好准备。本题解涉及了多个编程语言和算法的概念,下面我将从提供的文件内容中提炼出相关知识点。 ##...

    网鼎杯-第三场-杂项-track_hacker

    除了分析数据包本身,我们还需要关注时间戳,看看是否有特定时间点的活动模式,这可能与攻击者的定时触发机制有关。同时,观察数据包间的交互顺序,有时能帮助我们理解攻击的流程。 总的来说,解决"track_hacker...

    processhacker-2.23-setup

    Process Hacker是一款功能丰富的系统程序,比windows自带的任务管理器功能更强大。用户只要借助该程序就可以方便,快捷地查看相关进程的速度,内存,及模块等等,除此,还可以对相关的进程进行管理工作。

Global site tag (gtag.js) - Google Analytics