Linux 进程堆栈中具有线程结构的意义

Linux 进程堆栈中具有线程结构的意义,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,想知道为什么thread\u struct是Linux中进程堆栈的一部分。 Robert Love说,它可能位于进程堆栈的最低内存地址 1) 为什么我们需要将其放在流程堆栈的第一位 2) 如果我们需要将它放在进程堆栈的固定地址(最低内存地址)-这是否意味着进程堆栈的大小是固定的?thread_struct位于堆栈的固定偏移量处的原因是,它是一个被多次访问的数据结构,每个任务都需要一个单独的数据结构 因此,最好将thread_结构的地址放入寄存器。这样,每当我们需要它访问它时,它的地址就已经在寄存

想知道为什么
thread\u struct
是Linux中进程堆栈的一部分。 Robert Love说,它可能位于进程堆栈的最低内存地址

1) 为什么我们需要将其放在流程堆栈的第一位


2) 如果我们需要将它放在进程堆栈的固定地址(最低内存地址)-这是否意味着进程堆栈的大小是固定的?

thread_struct位于堆栈的固定偏移量处的原因是,它是一个被多次访问的数据结构,每个任务都需要一个单独的数据结构

因此,最好将thread_结构的地址放入寄存器。这样,每当我们需要它访问它时,它的地址就已经在寄存器中了,而且由于寄存器作为任务上下文切换的一部分进行了交换,所以每次切换任务时,地址都会自动更改

只有一个问题——某些体系结构(如x86)的寄存器供应非常有限。仅为线程结构地址“浪费”整个寄存器是不可行的

但是,我们已经有一个指向堆栈的专用寄存器。通过将thread_struct放置在堆栈起始位置的固定偏移量处,我们可以通过对堆栈指针寄存器的值应用位掩码来获得此重要数据结构的地址-因此我们可以同时获得这两个方面的最佳效果-廉价访问thread_Stick,而不浪费寄存器


是的,内核空间任务堆栈是有限的,通常是一个或两个体系结构页面,但是线程结构和堆栈指针的技巧不是原因。

小的修正——我们不能通过向堆栈指针添加固定的立即数来获得
线程结构的地址,但是通过一个位掩码的逻辑AND操作,它将一些低阶位设置为零。谢谢@AlexD,我已经相应地更正了我的答案。所以,我的问题是-为什么是进程堆栈的一部分。我们都知道我们有这个过程的pid。我们可以使用pid来解析进程表,并找出“线程信息”或任务结构?@S22您认为进程(从技术上讲,线程)的pid存储在哪里?:-)在线程结构中。。。。