- sbi-rt :按照sbi規範制定的接口,寫的挺好的。這裏直接調用了彙編代碼
- sbi-spect: sbi-rt 裏面用到一些常量
- sbi-testing:測試
- src: 不知道啥用。貌似某個學校寫的玩具,還有第幾章的字樣, 不能嚴謹一點嗎?
到這裏,還沒有看到具體的實現呢?
- 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);
}