我知道中断处理是如何工作的(切换模式、保存寄存器、更改堆栈......)。但是,我很好奇,如果在我们仍处于内核模式而不是用户模式时发生中断怎么办?
答案1
一模一样。然而,如果我们正在处理一个中断,那么可能什么也没有,或者直到我们完成之前什么也没有。
我们在所有情况下都会做什么:
- 无条件保存模式,并将模式设置为管理模式(由硬件完成。由中断触发)
- 无条件保存状态并切换堆栈
- 运行中断代码
- 无条件切换堆栈、恢复状态和恢复模式
短语“将模式设置为管理员模式”可以解读为以下任意一种:
- 确保模式是主管模式。
- 将 1 写入状态寄存器的 S 位
中断中断
可能有多个(但有限)中断优先级。每个级别都会有一个堆栈。一个中断只能被更高优先级的中断打断。较低优先级的中断可以被较高优先级的中断阻止。这解决了大部分问题,而不是堆栈不能被损坏。
然而,较低优先级的中断可以被阻止(包括用户进程。这些是最低优先级的中断)。因此,确保中断快速(代码不多)非常重要,特别是对于较高优先级的中断:完成工作并退出,让较低优先级的中断(例如用户进程)执行需要时间的操作。
堆栈
当进程调用内核时,内核可以使用与进程相同的堆栈(同步调用:在程序代码中使用系统调用)。
内核还将为每个中断优先级提供一个堆栈。请参阅有关中断中断的部分。