在intel x86 32/64位架构上,每个线程拥有自己的堆栈。 内核在同一进程的线程之间切换,当前线程的堆栈和寄存器在某处备份。我想它是在堆栈中?
这是否意味着如果我的进程中有N个线程,我将在进程内存中有N + 1个堆栈?还是由内核管理?如果它知道该线程的esp / bsp,我可以线程读取另一个线程的堆栈吗? (我说的是同一过程的线程)
答案 0 :(得分:0)
内核在同一进程的线程之间切换,当前线程的堆栈和寄存器在某处备份。我想它是在堆栈中?
是的,那是正确的。通常,重新安排由timer interrupt
触发。与任何其他硬件中断[1]一样,timer interrupt
请求CPU暂时停止工作,并执行一些特殊代码interrupt service routine
。内核可以自己设置它,所以它只是内核提供的一个函数。通常,内核在发生中断时所做的第一件事就是将所有寄存器压入堆栈。内核必须保存的唯一内容是堆栈顶部esp
。当内核现在切换到另一个线程时,它所要做的就是加载新线程esp
并弹出所有寄存器。
这是否意味着如果我的进程中有N个线程,我将在进程内存中有N + 1个堆栈?
你很可能在内存中有N个堆栈,在内核内存中有N个堆栈,作为中断,调用内核代码,加载另一个堆栈。通常,每个线程都有自己的内核堆栈,但不要引用我。
如果它知道该线程的esp / bsp,我可以线程读取另一个线程的堆栈吗? (我说的是同一过程的线程)
是的,你可以。同一进程中的线程共享相同的虚拟地址空间,因此如果您知道线程堆栈的确切位置,则可以访问此内存。
[1]:当发生某些事情时,来自CPU“外部”的Programmable Interrupt Controller触发硬件中断,例如键盘上的按键。还有软件中断,它们由cpu /软件本身触发,用于处理或处理错误(除以零)。软件中断是实现系统调用的一种方法,因为您无法从ring-3代码调用ring-0代码。然而,如果设置TSS,则中断可以“上升”到响铃0。