【发布时间】:2012-02-22 21:54:35
【问题描述】:
我正在关注 Linux 设备驱动程序。在引入自旋锁的时候,给出了如下的例子:
您的驱动程序正在执行并且刚刚取出控制对其设备的访问的锁。当锁被持有时,设备会发出一个中断,这会导致你的中断处理程序运行。中断处理程序,在访问设备之前,还必须获得锁。在中断处理程序中取出自旋锁是合法的事情。这是自旋锁操作不休眠的原因之一。但是,如果中断例程与最初获取锁的代码在同一处理器中执行,会发生什么情况呢? 当中断处理程序正在旋转时,非中断代码将无法运行以释放锁定。该处理器将永远旋转。
我不明白为什么如果中断处理程序正在旋转,则无法执行非中断代码。
是不是因为中断处理程序中的例程不能被抢占?如果是这样,是不是说中断例程必须是原子的?
【问题讨论】:
-
中断处理程序正在旋转,因为它试图获取已由非中断代码持有的自旋锁,后者可能不一定在中断完成之前运行。
标签: linux linux-kernel kernel interrupt spinlock