Linux 为什么软件中断可以休眠,而硬件中断不允许?

Linux 为什么软件中断可以休眠,而硬件中断不允许?,linux,linux-kernel,linux-device-driver,device-driver,Linux,Linux Kernel,Linux Device Driver,Device Driver,为什么我们可以在软件中断的情况下睡觉,而在硬件中断的情况下不允许睡觉? e、 g.系统调用可以休眠,而ISR不能休眠。当您通过进程(即系统调用)输入内核代码时,内核被称为处于进程上下文中。这意味着内核是代表进程执行的。内核的执行与用户级同步,因此可以访问用户级。也可以调用休眠函数,因为调度器能够调度新进程 当您从硬件源(即中断)输入内核时,内核被称为处于中断上下文中。内核的执行相对于用户级是异步的,您不能对用户级执行的内容进行任何假设。例如,某些资源可能处于不一致状态。因此,由于调度程序无法调度

为什么我们可以在软件中断的情况下睡觉,而在硬件中断的情况下不允许睡觉?
e、 g.系统调用可以休眠,而ISR不能休眠。

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


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

Rubini的书《Linux设备驱动程序》第三版很好地解释了这一差异

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

  • 请注意,在软件中断上下文中执行的代码不允许休眠。例如,请参见网络驱动程序中的发送和接收代码路径。系统调用本身不是在中断上下文中执行的,而是在进程上下文中执行的。在某些情况下,软件中断仅用于将控制权正确地传递给它们。