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

San*_*yal 2 linux device-driver linux-device-driver linux-kernel

为什么我们可以在软件中断的情况下睡觉,而在硬件中断的情况下是不允许的?例如,系统调用可以睡眠,而ISR无法睡眠.

Cla*_*dio 6

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

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

Rubini的书" Linux设备驱动程序"(第3版)可以在网上免费获得这种差异.