在 Linux 2.6 内核之前,struct task_struct
它存在于每个进程的内核堆栈的末尾。没有任何thread_info struct
概念。但在Linux 2.6内核中,不是task_struct
将其放置在进程的内核堆栈的末尾,而是将其thread_info struct
放置在末尾。这个 thread_info 结构包含一个指向该task_struct
结构的指针。
需要thread_info
引入什么结构?我们可以直接task_struct
使用位于进程内核堆栈末尾的stack pointer
if 来访问该结构。task_struct
在 2.6 内核中,task_struct
使用 动态分配slab_allocator
。在 2.6 内核之前,它是静态分配的吗?
答案1
我不知道为什么这样做。但是,如果您git blame
对该文件执行 a 操作并找到引入更改的提交,就很容易找到它。通常提交消息会对所提交的更改进行非常详细的解释。
答案2
我们需要的原因是线程信息这是因为我们正在分配内存任务结构使用板分配器。现在你可能会问这之间有什么关系?
要了解这一点,您需要了解 Slab Allocator 的工作原理。
如果没有 Slab Allocator ,内核开发人员可以为特定进程的内核堆栈中的 task_struct 分配内存,以便可以轻松访问它。现在随着 Slab Allocator 的出现,内存被分配给由 Slab Allocator 确定的 task_struct 。因此,使用 Slab 分配器,您可以将 task_struct 存储在其他位置,而不是存储在特定进程的内核堆栈中。现在内核开发人员引入了thread_info,并在其中放置了一个指向task_struct所在位置的指针。因此我们有线程信息在进程的内核堆栈中而不是任务结构。这就是为什么我们必须接受 thread_info。
您可以在 Robert Love 的《Linux 内核开发》一书中阅读有关 Slab Allocator 的内容。