thread_info 简介

thread_info 结构被称为迷你进程描述符,是因为在这个结构中并没有 直接包含与进程相关的字段,而是通过 task 字段指向具体某个进程描 述符。通常这块内存区域的大小是 8KB,也就是两个页的大小(有时候 也使用一个页来存储,即 4KB)。一个进程的内核栈和 thread_info 结构之间的逻辑关系如下图所示:

从上图可知,内核栈是从该内存区域的顶层向下(从高地址到低地址)增 长的,而 thread_info 结构则是从该区域的开始处向上(从低地址到高 地址)增长。内核栈的栈顶地址存储在 esp 寄存器中。所以,当进程从用 户态切换到内核态后,esp 寄存器指向这个区域的末端。

由于一个页大小是 4K,一个页的起始地址都是 4K 的整数倍,即后 12 位都为 0,取得 esp 内核栈栈顶的地址,将其后 12 位取 0,就可以得 到内存区域的起始地址, 该地址即是 thread_info 的地址,通过 thread_info 又可以得到 task_struct 的地址进而得到进程 pid。

 

Reference:

https://biscuitos.github.io/blog/TASK-thread_info_stack/#A00

https://blog.csdn.net/gatieme/article/details/51577479

posted @ 2021-04-19 11:33  Ivessas  阅读(891)  评论(0)    收藏  举报