在Linux 2.6内核中需要thread_info结构吗?

时间:2011-05-26 05:49:00

标签: process linux-kernel

在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内核之前,它是静态分配的吗?

3 个答案:

答案 0 :(得分:6)

弗兰克,他正在寻找(出于纯粹的兴趣,因为我,我怀疑)这个变化的原因。这个,如果我发现我的l33t谷歌技能。链接后面的更多信息:

  

“task_struct很大。在32位机器上它大约是1.7KB   另一方面,你可以很容易地看到thread_info更加纤薄。

     

内核堆栈是4或8KB,无论哪种方式都是1.7KB   很多,所以存储一个更细的结构,指向task_struct,   立即节省了大量的堆栈空间,是一种可扩展的解决方案。“

(c)http://www.spinics.net/lists/newbies/msg22263.html

答案 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版以下语句,这可能有助于您理解

“新结构还可以很容易地计算其值的偏移量,以便在汇编代码中使用”