【问题标题】:Restrictions while kernel is running an ISR routine内核运行 ISR 例程时的限制
【发布时间】:2026-02-13 23:30:01
【问题描述】:

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

  • 在运行中断处理程序时是否禁用上下文切换?
  • 当进程处于关键状态时是否会发生上下文切换
    部分?
  • 内核模式内的哪些情况需要禁用更多中断?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    这意味着:

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

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

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

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

    【讨论】: