是否将中断分配给固定CPU (总是由同一个CPU处理)?
以下是我想提出的问题:
来自:http://msdn.microsoft.com/en-us/library/ms795060.aspx
保护共享区域的自旋锁具有与设备中断的DIRQL相等的IRQL。只要关键部分例程持有自旋锁并访问DIRQL上的共享区域,ISR就不能在单处理器或SMP机器中运行。
这在单处理器机器上是有意义的,因为中断将不会由CPU服务,直到锁被释放,因为CPU的IRQL不小于中断IRQL。然而,在SMP机器上,如何阻止其他CPU (而不是拥有锁的CPU )处理中断并损坏数据.?
发布于 2009-10-05 22:26:01
读下一节..。
在SMP机器中,
无法获得保护共享数据的自旋锁,而关键部分例程持有自旋锁并在DIRQL上访问共享数据。
..。我认为这是说在SMP机器上可以发生中断;但是如果中断发生了,那么中断服务例程(运行在另一个CPU上)仍然不能获得自旋锁:即它旋转、浪费周期、尝试获取自旋锁,除非您释放了让等待的ISR获得它的自旋锁。
我想知道为什么它可能允许ISR在另一个CPU上运行,而不是像在单CPU情况下那样屏蔽中断(以防止ISR被启动)。答案是,无论在保持自旋锁时是否可以在另一个CPU上启动新的ISR,事实上(与单CPU情况不同),在DIRQL自旋锁启动时,ISR可能已经在另一个CPU上运行了:正是因为这个原因,这样的ISR(如果它存在于另一个CPU上)必须旋转(如果它试图获得自旋锁)。
发布于 2009-10-05 22:20:50
我的理解是,当系统将DIRQL提升到一定的级别时,所有处理器上所有处于DIRQL或更低级别的中断都会被有效地禁用。这就是为什么你不应该提高IRQL的时间超过它绝对需要保持的时间。
很少有驱动程序代码需要将IRQL提升到高于调度级别(这不会掩盖任何中断)。唯一需要提高IRQL更高的驱动程序代码是实际需要与中断处理程序交互(共享数据)的代码。
编辑:ChrisW对SMP系统中正在发生的事情有更好的描述--提高处理器上的IRQL将防止IRQ在特定处理器上被处理。如果interrtupt处理程序计划在另一个CPU上,而保护共享数据的自旋锁由第一个CPU持有,则中断处理程序将在其CPU上旋转,直到第一个CPU释放自旋锁为止(为了永久访问共享数据,中断处理程序必须建立自旋锁,这就是迫使中断处理程序等待的原因)。
因此,保持这些自旋锁尽可能短(并且尽可能少)。
https://stackoverflow.com/questions/1522690
复制相似问题