在中断服务程序中,什么都不能用?

Dee*_*ain 0 operating-system interrupt linux-kernel

我知道ISR需要非常快,并且应该很快处理中断.但我不明白同样的原因.为什么要满足这个条件?而且,为了做到这一点,对ISR代码的所有内容有什么限制吗?通常情况下,所有不应包含在ISR代码中的内容?

谢谢

Ale*_*nze 5

当ISR执行时,没有线程可以在同一个CPU上执行,因此线程调度受到影响,执行的时间越长,影响就越大.根据实现(软件和硬件),可以在ISR执行时禁用所有中断(或较低优先级中断),这意味着如果ISR需要很长时间才能完成,其他中断可能无法足够快地处理,这意味着将是延迟甚至错过中断.

还有一些其他因素需要考虑:

  1. 在ISR中使用锁
  2. 触摸ISR中的分页内存

如果您在ISR中获得了一个可以锁定的锁,那么如果没有其他ISR或CPU可以释放该锁,则可能会进入无限循环.

如果你触摸一个交换到磁盘的内存页面,你可能会遇到类似的情况,因为页面错误处理程序可能无法将该页面从磁盘带到内存中,如果它在一个线程中执行该操作并且该线程不能执行是因为与ISR相比具有较低的优先级并且从未被调度.