我们引入一个对寄存器进行操作的库,这样就可以不用自己写了。
为了方便起见,我们先将 stvec 设置为 Direct 模式跳转到一个统一的处理程序。
这里我们通过设置 stvec 使得所有中断都跳转到 并将其作为中断处理程序。而这个中断处理程序仅仅输出了一下中断原因以及中断发生的地址,就匆匆 panic 了事。
我们在主函数中通过汇编指令手动触发断点中断:
使用 构建并运行,你可能能看到以下的正确结果:
但是很不巧,你有差不多相同的概率看到以下和我们预期不同的的结果:
内核进入了 Boot loop?
保证异常处理入口对齐
很遗憾是,Rust 没有简单地办法保证一个符号的对齐,此外使用纯 Rust 实现 Trap handler 还有一些其他的问题:Rust 会在函数的开始和结尾加入一些额外的指令,控制栈寄存器等。因此如果要完成保存现场等工作,以便在异常处理程序完成后返回,Rust 单独是难以完成的。接下来几节中我们将通过提供使用汇编代码编写的异常处理程序来解决这些问题。