1. // src/interrupt.rs
    2. pub fn init() {
    3. unsafe {
    4. extern "C" {
    5. fn __alltraps();
    6. stvec::write(__alltraps as usize, stvec::TrapMode::Direct);
    7. // 设置 sstatus 的 SIE 位
    8. sstatus::set_sie();
    9. }
    10. println!("++++ setup interrupt! ++++");
    11. }

    让我们来更新 rust_trap 函数来让它能够处理多种不同的中断——当然事到如今也只有三种中断:

    1. 使用 ebreak 触发的断点中断;
    2. 使用 ecall 触发的系统调用中断;
    3. 时钟中断。

    同时修改主函数 rust_main

    1. // src/init.rs
    2. #[no_mangle]
    3. pub extern "C" fn rust_main() -> ! {
    4. crate::interrupt::init();
    5. crate::timer::init();
    6. unsafe {
    7. asm!("ebreak"::::"volatile");
    8. }
    9. panic!("end of rust_main");
    10. loop {}
    11. }

    我们期望能够同时处理断点中断和时钟中断。断点中断会输出断点地址并返回,接下来就是 panic,我们 panic 的处理函数定义如下:

    最后的结果确实如我们所想:

    breakpoint & timer interrupt handling

    1. ++++ setup interrupt! ++++
    2. ++++ setup timer! ++++
    3. a breakpoint set @0x8020002c
    4. panicked at 'end of rust_main', src/init.rs:11:5
    5. * 100 ticks *
    6. * 100 ticks *
    7. ...

    如果出现问题的话,可以在这里找到目前的代码。