特权寄存器指南

本文档将介绍如何方便地修改和读取特权寄存器,以及修改和读取特权寄存器的特定字段。

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> 方法来修改特定字段。

例如我们需要修改 mstatusMPP 位,我们可以

use riscv::register::mstatus;

...

    mstatus::set_mpp(riscv::register::mstatus::MPP::Supervisor);

读取寄存器的特定字段

我们可以使用寄存器的 <name> 方法来读取特定字段。

例如我们需要读取 mstatusMPP 位,我们可以

use riscv::register::mstatus;

...

    let mpp = mstatus::mpp();