为什么软件中断在硬件中断时不允许睡眠?

时间:2013-12-19 12:19:17

标签: linux linux-kernel linux-device-driver device-driver

为什么我们可以在软件中断的情况下睡眠,而在硬件中断时不允许这种情况? 例如当ISR无法入睡时,系统调用可以休眠。

2 个答案:

答案 0 :(得分:6)

当您通过进程(即系统调用)输入内核代码时,内核被称为处于进程上下文。这意味着内核是代表进程执行的。内核的执行与用户级同步,因此可以访问用户级。也可以调用休眠函数,因为调度程序能够安排新进程。

当您从硬件源(即中断)进入内核时,内核被称为处于中断上下文。内核的执行在用户级别上是异步的,您不能对在用户级别执行的内容做任何假设。例如,某些资源可能处于某种不一致的状态。因此,代码无法阻止,因为调度程序无法安排新进程。

这一区别在Rubini的书 Linux设备驱动程序,第3版中得到了很好的解释,即freely available on the web

答案 1 :(得分:0)

  1. 通常情况下,ISR会在禁用中断的情况下运行,因此如果在ISR中睡眠,我们就没有机会醒来。
  2. 中断处理程序使用中断进程的内核堆栈。如果我们切换到ISR中的其他进程,内核堆栈将更改为其他进程。