中断发生时PSW、PC等寄存器是保存在PCB还是内核栈中?
中断上下文存储相关问题解答
关于用户寄存器的保存逻辑
你参考的资料没有遗漏,只是把硬件自动完成的操作和软件层面的操作分开讲了:
- 中断触发的瞬间,硬件只会自动保存PSW和PC两个寄存器到控制栈(内核栈),这是CPU中断响应逻辑的固有设计,目的是为了最快速度切换到内核态的中断处理程序入口。
- 剩下的通用寄存器、用户态相关寄存器,是进入中断处理程序之后,由操作系统的中断入口汇编代码主动保存到栈上的。如果是不需要切换进程的中断(比如磁盘IO完成中断只需要唤醒等待的进程,不需要打断当前运行进程的执行),处理完中断后会直接从栈上把所有寄存器恢复,回到被中断的进程继续执行,全程不需要碰PCB。
为什么先存到栈而不是直接存到PCB
核心原因是性能和实现复杂度的权衡:
- 大多数中断是不会触发进程切换的,比如常见的网卡中断、磁盘中断、定时器中断(大部分时候只是更新系统时间、统计进程运行时间,不会触发调度),直接用栈存储上下文的读写速度远高于先找到当前进程PCB再逐个写入,处理完直接出栈恢复即可,流程非常轻量。
- 只有当中断处理过程中,调度器判定需要切换进程的时候,才会把栈里保存的所有寄存器上下文整体拷贝到当前进程的PCB里,再从下一个要运行的进程的PCB里把上下文拷贝到内核栈,后续出栈恢复的时候就直接切到新进程运行了。
关于你猜想的验证
你的猜想基本正确,但本质上所有中断的上下文第一存储位置都是当前进程的内核栈,只有需要进程切换的场景才会额外把栈里的上下文同步到PCB:
- 不需要切换进程的中断:上下文全程存在内核栈,处理完直接从栈恢复返回被中断的进程,和PCB完全无关。
- 需要切换进程的中断:先把上下文存在内核栈,调度触发时把栈里的内容转存到当前进程PCB,再把新进程PCB里的上下文加载到内核栈,最后从栈恢复寄存器运行新进程。
内容的提问来源于stack exchange,提问作者Davide
相关产品推荐
相关产品推荐

