中断:保存在 PCB 或内核堆栈中的进程上下文?
Posted
技术标签:
【中文标题】中断:保存在 PCB 或内核堆栈中的进程上下文?【英文标题】:Interrupts: process context saved in PCB or kernel stack? 【发布时间】:2022-01-05 13:31:25 【问题描述】:我已经搜索并阅读了几个类似的问题但仍然不明白:
PSW 是一组处理器标志(进位、溢出等)。 我的书说,当产生中断时,PSW 和 PC 保存在控制堆栈中,中断处理程序启动,最后 CPU 状态恢复:所有剩余的寄存器,例如用户寄存器?作者只是忘记了他们,还是根本没有得救?
为什么 PSW 和 PC 保存在控制堆栈上而不是 PCB 上(所有处理器寄存器都将保存在哪里)?
我可以理解何时执行系统调用(它是同步中断):处理器切换到内核模式并在内核堆栈上工作。但是什么时候发生时钟中断并且操作系统决定切换到另一个进程?在那种情况下,必须使用 PCB 而不是正确的堆栈?
我的结论是,有些中断可以通过内核区域中的单独堆栈进行管理,但其他中断需要将 PSW 和 PC 保存在 PCB 中,而不是与其他寄存器一起保存在堆栈中。 但是,我希望各位专家回答我的问题 =) 提前致谢!
【问题讨论】:
'但是什么时候发生时钟中断并且操作系统决定切换到另一个进程?'钟?您的意思是“任何导致设备驱动程序在退出中断状态时请求调度运行的硬件中断”。 【参考方案1】:中断/IRQ 与任务切换关系不大。
当 CPU 启动一个中断处理程序时,它需要更改一些东西(例如 PC)来启动中断处理程序,因此它需要存储旧值,以便在中断处理程序返回时可以恢复它们。中断处理程序可能会存储额外的东西(例如用户寄存器),但可能不会(如果它本身不使用它们);并且在某些情况下(例如,只增加一个计数器的 IRQ)中断处理程序几乎可以不保存任何额外内容,几乎不使用任何内容,几乎不恢复任何内容,然后返回。
取决于哪个操作系统以及它应该如何工作;如果中断处理程序感觉像是在进行任务切换,那么一些中断处理程序的东西(例如 PC)将需要保存在某个地方。 “某处”可以直接在 PCB 中,但也可以在内核的堆栈上(只有堆栈指针保存在 PCB 中)。请注意,大多数操作系统使用高级语言的调用约定,其中只有一些东西是“被调用者保留”,而其他东西可以被被调用者丢弃,因此在任务切换期间不需要保存在任何地方,因为调用者希望它们无论如何都要被丢弃。
【讨论】:
好的,所以当中断发生时,处理器将 PSW 和寄存器保存在内核堆栈中(它与“控制堆栈”相同吗?)。当处理程序完成时,可能会发生上下文切换,然后堆栈上的相同信息也可以保存在 PCB 上(这是时钟中断的情况)?对吗? @BartDoe: 否 - 当中断发生时 CPU + 中断处理程序从寄存器中保存用户状态;然后如果任务切换发生,任务切换代码会从寄存器中保存中断处理程序的状态(不是用户的状态)。 内核栈很可能是 PCB/TCB 结构的成员。如果一个线程/进程需要一个控制/状态结构和一个内核堆栈,为什么还要单独分配它们呢?也可以一次性使用 kmalloc。以上是关于中断:保存在 PCB 或内核堆栈中的进程上下文?的主要内容,如果未能解决你的问题,请参考以下文章
结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程