在阅读 Linux 设备驱动程序时,我可以理解进程描述符(类型struct task_struct
)包含有关特定任务的所有信息。进程描述符由slab分配器动态分配。
我想知道的是需要引入一个名为 的新结构,thread_info
该结构存储在堆栈底部(假设是 x86)。为什么要这样做?
为什么无法将当前执行任务地址(struct task_struct
)的地址放入内核堆栈?
答案1
我们需要的原因是线程信息这是因为我们正在分配内存任务结构使用Slab分配器。现在你可能会问这之间有什么关系?
要了解这一点,您需要了解 Slab Allocator 的工作原理。
如果没有 Slab Allocator ,内核开发人员可以为任务结构在特定进程的内核堆栈中,以便可以轻松访问它。现在随着 Slab Allocator 的出现,内存被分配给任务结构由 Slab 分配器确定。所以有了Slab Allocator,你就拥有了任务结构存储在其他地方而不是特定进程的内核堆栈中。现在内核开发者介绍了线程信息并在其中放置一个指向该位置的指针任务结构居住。这就是为什么我们必须忍受线程信息。
您可以在 Robert Love 的《Linux 内核开发》一书中阅读有关 Slab Allocator 的内容。
答案2
轻量级流程没有task_struct
;一个堆栈和少量信息就足够了。多个 LWP 共享相同的task_struct
,其中包含所有资源描述。