image.png

  • sbi-rt :按照sbi规范制定的接口,写的挺好的。这里直接调用了汇编代码
  • sbi-spect: sbi-rt 里面用到一些常量
  • sbi-testing:测试
  • src: 不知道啥用。貌似某个学校写的玩具,还有第几章的字样, 不能严谨一点吗?

到这里,还没有看到具体的实现呢?

image.png

  • rust-qemu 能给qemu虚拟机直接用的。
  • 整体写的过于麻烦了,写的底层的也不是很容易,还要写一个test-kernel. 给作者点赞,这个测试很给力,就喜欢这么严谨的样子。
  • 我原本以为是要自己写一个各种寄存器调用,去实现sbi 规范的的接口,比我想象中的简单多了,本质上就是调用规范约定的寄存器,qemu 或者硬件的厂商,已经棒我们做了这个事情。

#[naked]
#[no_mangle]
#[link_section = ".text.entry"]
unsafe extern "C" fn _start() -> ! {
    asm!(
        "   call {locate_stack}
            call {rust_main}
            j    {trap}
        ",
        locate_stack = sym trap_stack::locate,
        rust_main    = sym rust_main,//准备跳转数据
        trap         = sym trap_vec, //跳转到中断向量表
        options(noreturn),
    )
}

//rust_main 里面部分代码
//将所有中断和异常都委托给M模式处理(不委托给S模式)。
//禁用低特权级别对性能计数器寄存器的访问。
//设置陷阱向量基址寄存器mtvec,确保所有陷阱处理都会跳转到指定的陷阱处理程序地址trap_vec。
 unsafe {
        asm!("csrw mideleg,    {}", in(reg) !0);
        asm!("csrw medeleg,    {}", in(reg) !0);
        asm!("csrw mcounteren, {}", in(reg) !0);
        use riscv::register::{medeleg, mtvec};
        medeleg::clear_supervisor_env_call();
        medeleg::clear_machine_env_call();
        mtvec::write(trap_vec as _, mtvec::TrapMode::Vectored);
    }

putao
8 声望1 粉丝

推动世界向前发展,改善民生。