内核运行ISR例程时的限制

时间:2012-04-08 16:42:50

标签: operating-system locking linux-kernel interrupt context-switch

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

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

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

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

1 个答案:

答案 0 :(得分:4)

简而言之: NO CONTEXT SWITCH,EVER

这意味着:

  • 没有先发制人
  • 互斥锁没有锁定(改为使用自旋锁,确保你的非ISR对手通过spin_lock_irqsave获取它们以禁用IRQ)
  • 不调用任何可以睡眠的内核函数(查看函数的文档,某些函数也有_cansleep变种)。

进程切换可能发生在页面错误上,但在处理完相应的ISR后会发生。基本上,如果路径不是ISR并且没有锁定螺旋锁,则可以安排路径。如果你持有一个螺旋锁,你必须避免睡觉,直到它被释放。

由于ISR非常有限,因此IRQ的处理通常分为上半部分(在ISR上下文中运行并执行关键作业)和下半部分(后来作为内核线程运行并执行任何操作)被延迟)可以睡觉有关更多信息,请参阅此页面:

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