锁与中断的死锁

这是内核编程的第一铁律:持有自旋锁期间,必须关闭本地中断。

死锁场景 (The Scenario)

  1. 进程 A 获取了 uart_tx_lock,正在写控制台。
  2. 此时发生时钟中断(或其他中断),CPU 暂停 A,跳转到中断处理程序 (ISR)。
  3. ISR 试图打印日志,也去获取 uart_tx_lock
  4. 死局:
    • ISR 在 while 循环里自旋,等待锁释放。
    • 进程 A 只有在 ISR 返回后才能继续运行释放锁。
    • 结果: CPU 永远卡死在 ISR 里。

xv6 机制: push_off / pop_off

  • acquire 自动调用 push_off() (关中断 + 计数器加 1)。
  • release 自动调用 pop_off() (计数器减 1,减到 0 才开中断)。
  • 这支持了嵌套加锁场景下的中断管理。