Top-Half与Bottom-Half
这是驱动开发中解决 “中断必须快” 与 “处理逻辑很慢” 这一矛盾的核心战术。虽然 xv6 的实现比较简陋,但它是现代 OS(如 Linux)中 Softirq、Tasklet、Workqueue 的雏形。
核心矛盾
- 中断上下文 (Top Half): 当硬件触发中断时,CPU 往往关闭了其他中断(或同级中断)。
- 后果: 如果 ISR (Interrupt Service Routine) 运行时间太长(比如还在做复杂的解密或搜索),会阻塞后续的关键中断(如网卡丢包、鼠标卡顿)。
分层策略
- 上半部 (Top Half): “急诊室”。
- 任务: 最小化。只做必须立即完成的事(读取硬件寄存器、清除中断标志、把数据拷贝到内存 Buffer)。
- 特性: 关中断运行,绝对不能 Sleep。
- xv6 实现: 例如
uartintr,它只负责把字符从 UART 读到cons.buf,然后调用wakeup。
- 下半部 (Bottom Half): “住院部”。
- 任务: 耗时化。处理数据的具体逻辑(解析协议、写文件、显示到屏幕)。
- 特性: 开中断运行,可以被调度,可以 Sleep。
- xv6 实现: 实际上就是被
wakeup唤醒后的 进程上下文(如consoleget)。当 ISR 返回后,调度器会让 Shell 进程继续运行,由 Shell 来处理刚才收到的数据。
安全视角
在内核漏洞利用中,攻击者常利用 Top Half 的原子性来构造 Race Condition。如果开发者错误地把耗时操作放在 Top Half,会导致系统响应延迟,甚至内核看门狗 (Watchdog) 超时复位。