特权寄存器指南
本文档将介绍如何方便地修改和读取特权寄存器,以及修改和读取特权寄存器的特定字段。
rCore 的 riscv 库提供了较为全面的特权寄存器支持。利用这个库,我们可以更方便地操作特权寄存器。
导入 riscv 库
首先,在 Cargo.toml
的 [dependencies]
中加一行
riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] }
然后在需要使用 riscv 库的文件中 use riscv::register::<reg>;
即可使用对应的寄存器。如果使用的寄存器较多,也可以 use riscv::register::*;
导入所有的寄存器。
修改特权寄存器
我们可以使用寄存器的 write
方法来写入特权寄存器。
例如我们需要将 mepc
设置为 main
函数(这个操作在从 m mode 到 s mode 中很重要,函数名可以不同),我们可以(需要在函数中调用 write
)
use riscv::register::mepc;
...
mepc::write(rust_main as usize);
读取特权寄存器
我们可以使用寄存器的 read
方法来读取特权寄存器。
例如我们需要读取 sstatus
,我们可以
use riscv::register::sstatus;
...
let sstatus = sstatus::read();
修改寄存器的特定字段
我们可以使用寄存器的 set_<name>
方法来修改特定字段。
例如我们需要修改 mstatus
的 MPP
位,我们可以
use riscv::register::mstatus;
...
mstatus::set_mpp(riscv::register::mstatus::MPP::Supervisor);
读取寄存器的特定字段
我们可以使用寄存器的 <name>
方法来读取特定字段。
例如我们需要读取 mstatus
的 MPP
位,我们可以
use riscv::register::mstatus;
...
let mpp = mstatus::mpp();