内核运行ISR例程时的限制

Sha*_*dra 5 operating-system locking interrupt context-switch linux-kernel

在内核模式和ISR例程中有哪些重要的事情和不重要的事情?例如 -

  • 运行中断处理程序时是否禁用了上下文切换?
  • 当进程位于关键
    部分内时,是否可以发生上下文切换?
  • 内核模式中的哪些情况值得禁用进一步的中断?

如何在页面错误上发生进程切换,其中进程从磁盘获取数据,但在其他中断发生期间不会发生.如果可执行路径可以被中断/重新安排/抢占,您如何分类?

当进程处于内核模式或处理ISR例程时,必须记住的其他事项是什么?

Gnu*_*rou 4

简而言之:永远没有上下文切换

这意味着:

  • 无抢占
  • 互斥体上没有锁(改为使用自旋锁,并确保非 ISR 对方使用 spin_lock_irqsave 获取它们以禁用 IRQ)
  • 不调用任何可以睡眠的内核函数(检查函数的文档,某些函数也有 _cansleep 变体)。

进程切换可以在页面错误时发生,但它发生在相应的 ISR 处理之后。基本上,如果不是 ISR 并且没有锁定自旋锁,则可以调度路径。如果您持有自旋锁,则必须避免休眠,直到它被释放。

由于 ISR 非常受限制,因此 IRQ 的处理通常分为上半部分(在 ISR 上下文中运行并执行关键工作)和下半部分(稍后作为内核线程运行并执行可以延迟的操作)哪个可以睡觉。请参阅此页面了解更多信息:

http://www.makelinux.net/ldd3/chp-10-sect-4