Linux 如何记住它的内核堆栈指针?
How does Linux remember its Kernel Stack Pointer?
我知道 Linux 中有两种类型的堆栈:每个用户线程的用户堆栈和内核线程的内核堆栈(但 1 个进程)。中断,更准确地说,中断程序,是这两种模式(内核(0)和用户(3))之间的桥梁。中断向量table让处理器在PC寄存器中加载正确的指令地址,但是当它切换到内核模式时堆栈指针寄存器是如何改变的呢?子程序是否在其第一条指令之前指示内核堆栈在哪里?还是处理器使用了两个堆栈指针寄存器(我真的很怀疑)?
"return from interrupt" 怎么知道去哪里 return? PCB是保存在内核栈还是其他地方?
如果我说的是真的,请不要犹豫纠正它。
非常感谢您的帮助。
Linux 内核中的内核模式堆栈存储在 task_struct->stack
中。它来自何处以及如何产生完全取决于平台。某些平台可能不会像上面那样保存它。但是你可以使用 task_stack_page()
来查找堆栈。
和
进入中断处理程序时,PC 存储在内核堆栈中。从中断返回时,此 PC 从内核堆栈加载回来。
我知道 Linux 中有两种类型的堆栈:每个用户线程的用户堆栈和内核线程的内核堆栈(但 1 个进程)。中断,更准确地说,中断程序,是这两种模式(内核(0)和用户(3))之间的桥梁。中断向量table让处理器在PC寄存器中加载正确的指令地址,但是当它切换到内核模式时堆栈指针寄存器是如何改变的呢?子程序是否在其第一条指令之前指示内核堆栈在哪里?还是处理器使用了两个堆栈指针寄存器(我真的很怀疑)?
"return from interrupt" 怎么知道去哪里 return? PCB是保存在内核栈还是其他地方?
如果我说的是真的,请不要犹豫纠正它。
非常感谢您的帮助。
Linux 内核中的内核模式堆栈存储在 task_struct->stack
中。它来自何处以及如何产生完全取决于平台。某些平台可能不会像上面那样保存它。但是你可以使用 task_stack_page()
来查找堆栈。
和
进入中断处理程序时,PC 存储在内核堆栈中。从中断返回时,此 PC 从内核堆栈加载回来。