在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
访问task_struct
结构。
在2.6内核中,使用task_struct
动态分配slab_allocator
。在2.6内核之前,它是静态分配的吗?
答案 0 :(得分:6)
“task_struct很大。在32位机器上它大约是1.7KB 另一方面,你可以很容易地看到thread_info更加纤薄。
内核堆栈是4或8KB,无论哪种方式都是1.7KB 很多,所以存储一个更细的结构,指向task_struct, 立即节省了大量的堆栈空间,是一种可扩展的解决方案。“
答案 1 :(得分:1)
我们需要 thread_info 的原因是我们使用 Slab Allocator 为 task_struct 分配内存。现在您可能会问这些之间的关系是什么?
要了解您需要了解Slab Allocator的工作原理。
如果没有Slab Allocator,内核开发人员可以为特定进程在内核堆栈中为task_struct分配内存,以便可以轻松访问它。现在随着Slab Allocator的出现,内存被分配给task_struct,由Slab Allocator确定。因此,使用Slab Allocator,您可以将task_struct存储在其他位置,而不是存储在特定进程的内核堆栈中。现在,内核开发人员引入了thread_info并在其中放置了一个指针,指向task_struct所在的位置。这就是为什么我们必须使用thread_info。
您可以在Robert Love的书“Linux Kernel Development”中阅读有关Slab Allocator的内容。
答案 2 :(得分:0)
嗨,在Linux内核开发的第25页上编写了第3版以下语句,这可能有助于您理解
“新结构还可以很容易地计算其值的偏移量,以便在汇编代码中使用”