锁与中断的死锁
这是内核编程的第一铁律:持有自旋锁期间,必须关闭本地中断。
死锁场景 (The Scenario)
- 进程 A 获取了
uart_tx_lock,正在写控制台。 - 此时发生时钟中断(或其他中断),CPU 暂停 A,跳转到中断处理程序 (ISR)。
- ISR 试图打印日志,也去获取
uart_tx_lock。 - 死局:
- ISR 在
while循环里自旋,等待锁释放。 - 进程 A 只有在 ISR 返回后才能继续运行释放锁。
- 结果: CPU 永远卡死在 ISR 里。
- ISR 在
xv6 机制: push_off / pop_off
acquire自动调用push_off()(关中断 + 计数器加 1)。release自动调用pop_off()(计数器减 1,减到 0 才开中断)。- 这支持了嵌套加锁场景下的中断管理。