5

内核模式和 ISR 例程中有哪些重要的注意事项?例如 -

  • 运行中断处理程序时是否禁用上下文切换?

  • 当进程在关键部分内时会发生上下文切换吗?
  • 内核模式内的哪些情况值得禁用进一步的中断?

进程切换为什么会发生在页面错误上,其中进程从磁盘获取数据,但在其他中断发生期间不会发生。您如何对可执行路径是否可以中断/重新调度/抢占进行分类?

当进程处于内核模式或处理 ISR 例程时,还需要记住哪些其他事情?

4

1 回答 1

4

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

这表示:

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

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

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

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

于 2012-04-09T02:21:30.923 回答