Timer-时钟中断
时钟中断 (Timer Interrupt) 是操作系统的 “心脏起搏器”。它是唯一一个不由用户行为触发,而是由物理时间触发的中断。
硬件机制 (CLINT)
RISC-V 硬件包含一个核心本地中断控制器 (CLINT)。
mtime: 一个不断自增的 64 位寄存器(实时时间)。mtimecmp: 比较寄存器。当mtime >= mtimecmp时,触发一次时钟中断。- 重置: 内核在处理完一次时钟中断后,必须重新设置
mtimecmp = mtime + INTERVAL,以预约下一次中断。
战术价值:抢占式调度 (Preemptive Scheduling)
如果没有时钟中断,操作系统将退化为 “协作式多任务”。
- 场景: 用户写了一个
while(1);死循环。 - 无时钟: CPU 永远被占用,Shell 卡死,管理员无法 SSH,只能拔电源。
- 有时钟:
- 硬件强行打断死循环。
- 进入
usertrap→devintr。 - 判断是 Timer Interrupt → 调用
yield()。 yield()调用sched(),强行把当前进程踢下 CPU,换另一个进程运行。
xv6 实现细节
- xv6 的时钟中断通常在 Machine Mode (M态) 触发。
timervec.S(M态汇编) 负责接收这个硬件中断,然后通过软件生成一个 Supervisor Software Interrupt,通知 S态的内核进行调度处理。- 原因: 这种设计允许 M 态(固件层)完全掌控物理时钟,而 S 态(内核层)只处理逻辑调度。