`
coderplay
  • 浏览: 571837 次
  • 性别: Icon_minigender_1
  • 来自: 广州杭州
社区版块
存档分类
最新评论

kernel源码学习:进程

阅读更多
linux使用上百个双向链表来存储内核的各种数据结构, 其中包括进程描述符的task_struct结构.
cpp 代码
 
  1. struct list_head {  
  2.     struct list_head *next, *prev;  
  3. };  
在list.h中,形如__xxx的函数用来操作整个链表,而不是单个链表元素.


进程从pid得到进程描述符pd要一种高效的方法, 提到高效方法,那就用哈希表啦.  内核在这儿的哈希方法为一道宏, 表中有PIDHASH_SZ个元素(一般情况下PIDHASH_SZ=1024):
cpp 代码
 
  1. #define pid_hashfn(x)   ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))  

哈希表解决冲突的方法以是采取双向链表. 这是数据结构中一种比较常见的手段. 因为数字比较大的pid很少用到, 这样的pid一般放在链表尾端。 而数字较小的pid经常用到, 而它们如果冲突也排在链表很前的位置, 所以采取这样的数据结构速度很快.
   内核提供了hash_pid()来加入一个元素到表中, unhash_pid()从表中删除一元素. 
   这个哈希表的主要目的是通过pid找到进程描述符,
find_task_by_pid()提供了这项功能.
cpp 代码
 
  1. static inline void hash_pid(struct task_struct *p)  
  2. {  
  3.     struct task_struct **htable = &pidhash[pid_hashfn(p->pid)];  
  4.   
  5.     if((p->pidhash_next = *htable) != NULL)  
  6.         (*htable)->pidhash_pprev = &p->pidhash_next;  
  7.     *htable = p;  
  8.     p->pidhash_pprev = htable;  
  9. }  
  10.   
  11. static inline void unhash_pid(struct task_struct *p)  
  12. {  
  13.     if(p->pidhash_next)  
  14.         p->pidhash_next->pidhash_pprev = p->pidhash_pprev;  
  15.     *p->pidhash_pprev = p->pidhash_next;  
  16. }  
  17.   
  18. static inline struct task_struct *find_task_by_pid(int pid)  
  19. {  
  20.     struct task_struct *p, **htable = &pidhash[pid_hashfn(pid)];  
  21.   
  22.     for(p = *htable; p && p->pid != pid; p = p->pidhash_next)  
  23.         ;  
  24.   
  25.     return p;  
  26. }  
分享到:
评论

相关推荐

    百度翻译源码java-NOTES-windows-kernel-links:NOTES-windows-kernel-links

    百度翻译源码java awesome-windows-kernel-security-development 电源外壳 pe文件格式 汇编 崩溃/幽灵POC 轻量级 C++ gui 库 (mfc 皮肤 ui) 直接用户界面 (网吧) Chrome合金 Chrome扩展 头孢 网页浏览器 (库) ...

    Windows Process Analysis Tools (Windows程序分析工具源码)

    主要功能:查看进程,线程,模块,堆内存,窗口,挂起线程,结束线程,卸载模块,CPU使用率,内存使用率,附加pe文件解析,...学习了小半年的编程了 写出来还是有点成就感的 涉及的知识【MFC编程,Windows核心编程,C++,注入和hook】

    linux-2.6.24:linux kernel 2.6.24原始代码分析和学习笔记

    Linux 2.6内核学习笔记本仓库已经开始作为gitbook仓库,访问地址 GitHub访问地址 Something I hope you know before go into the coding~First, please watch or star this repo, I'll be more happy if you follow ...

    【专题四】Rootkit的学习与研究

    D:. ... │ Loading drivers and Native applications from kernel mode, withou t touching registry.rar │ └─9)内核中注入dll的一种流氓方法 9)内核中注入dll的一种流氓方法.doc Apc.rar

    Android4.4.4_r1:Android原始注解-android

    Android原始学习这是一个个人学习Android 4.4.4 r1源码的记录仓库文件按编译出来的模块存放: bootable编译成aboot.img文件(实际是一个bootloader ELF文件) kernel编程成boot.img的前半部,也就是Linux kernel...

    linux内核学习有关的资料.rar

    AT&T asm语法 bios设置图解 linux0.11下的内存管理 linux0.11-mem Linux+Kernel+Internals.pdf linux 进程源码分析 保护模式下的80386及其编程 操作系统模拟

    Reversing:逆向工程揭密

    11.4.6 加载KERNEL32.DLL 400 11.4.7 再加密函数 401 11.4.8 回到入口点 402 11.4.9 解析程序的参数 404 11.4.10 处理用户名 406 11.4.11 验证用户信息 407 11.4.12 解密代码 409 11.4.13 暴力破解Defender 409 11.5...

    使用root权限运行自己所编译程序的解决方法

    这几天照着UNP上提供的ping源码编写了一个用来学习。虽然编译后能运行,但由于使用了原始套接字,必须root权限运行,这与和Linux下真实的ping有差别:后者是不需要输入sudo或者切换到#才能运行的。linux中的ping源码...

    Linux内核工作原理 word版本 强烈推荐

    但是通过进一步观察你可以发现源码目录中包含有Kernel,mm以及net的目录, 不过要想知道这些目录中包含了那些代码以及代码是如何工作的就需要对Linux的总体结构与目标有较深入的理解。简而言之,这也是本书所希望达到...

    【升级】易语言文件解锁(关闭句柄法)-易语言

    上一次发布过的程序:【首发】检测文件的占用,具有学习和商业价值(By超级用户),可以使用,仿电脑管家 正文 对于怎么枚举文件句柄 ,上一帖子对此有介绍,核心代码大概如下:如果 (ZwQueryObject (handle, #...

Global site tag (gtag.js) - Google Analytics