博客 / 詳情

返回

sbi--rustsbi解讀

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);
    }
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.