我知道Linux中有两种类型的堆栈:每个用户线程的用户堆栈和内核线程的内核堆栈(但是1个进程)。中断,更准确地说是中断过程,是这两种模式(内核(0)和用户(3))之间的桥梁。中断向量表让处理器在PC寄存器中加载正确的指令地址,但是当它在内核模式下切换时,堆栈指针寄存器是如何改变的?子例程是否在第一条指令之前指示内核堆栈的位置?或者处理器是否使用两个堆栈指针寄存器(我真的怀疑它)?
"如何从中断返回"知道在哪里归来? PCB是否保存在内核堆栈或其他地方?
请不要犹豫,纠正我所说的不是真的。
非常感谢你的帮助。
答案 0 :(得分:2)
Linux内核中的内核模式堆栈存储在task_struct->stack
中。它来自何处以及如何来自完全取决于平台。有些平台可能没有像上面那样保存它。但是,您可以使用task_stack_page()
来查找堆栈。
和
进入中断处理程序时,PC存储在内核堆栈中。从中断返回时,此PC从内核堆栈加载回来。