- 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);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。