CSR 位字段

RISC-V mstatus CSR 寄存器详解

地址 0x300特权级 M模式访问 读写 / XLENMachine 状态、trap 与中断 CSR

机器模式状态寄存器,包含全局中断使能、特权级栈、扩展状态等控制字段。

位作用速览
bit 3 = 只有第 3 位;bits 12..11 = 第 12 到第 11 位
高位 MSB低位 LSB
SD63只读保留0
字段映射

按 bit 字段理解 mstatus

24 个关键字段
63

SD

只读

状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。

这个字段控制什么

  • - 状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。

常见取值

00

FS、VS、XS 中没有字段处于 Dirty 状态。

11

FS、VS 或 XS 至少有一个字段处于 Dirty 状态。

42

MDT

读写/硬件更新

机器禁用陷阱位;进入 M 模式陷阱时由硬件置位,MRET 返回时清零,用于控制双重陷阱行为。

这个字段控制什么

  • - 机器禁用陷阱位;进入 M 模式陷阱时由硬件置位,MRET 返回时清零,用于控制双重陷阱行为。

常见取值

00

未设置机器双重陷阱保护位。

11

机器双重陷阱保护位已设置;后续 M 模式陷阱按 Smdbltrp 规则处理。

39

MPV

读写/硬件更新

机器先前虚拟化模式;记录进入 M 模式陷阱前是否处于虚拟化执行状态。

这个字段控制什么

  • - 机器先前虚拟化模式;记录进入 M 模式陷阱前是否处于虚拟化执行状态。

常见取值

00

陷入 M 模式前未处于虚拟化执行状态。

11

陷入 M 模式前处于虚拟化执行状态。

38

GVA

读写/硬件更新

客户虚拟地址标志;指示写入 mtval 的地址是否为客户虚拟地址。

这个字段控制什么

  • - 客户虚拟地址标志;指示写入 mtval 的地址是否为客户虚拟地址。

常见取值

00

mtval 中的地址不是 guest virtual address。

11

mtval 中的地址是 guest virtual address。

37

MBE

读写

M 模式大端控制(Machine Big-Endian)。0=小端,1=大端。仅控制 M 模式下的显式内存访问。指令取指始终小端。SBE 和 UBE 可设为 MBE 的只读副本。

这个字段控制什么

  • - M 模式大端控制(Machine Big-Endian)。0=小端,1=大端。仅控制 M 模式下的显式内存访问。指令取指始终小端。SBE 和 UBE 可设为 MBE 的只读副本。

常见取值

0小端

M 模式显式内存访问按小端解释;指令取指不受该位影响。

1大端

M 模式显式内存访问按大端解释;指令取指不受该位影响。

36

SBE

读写/只读

S 模式数据访问字节序控制;0 为小端,1 为大端,指令取指仍为小端。

这个字段控制什么

  • - S 模式数据访问字节序控制;0 为小端,1 为大端,指令取指仍为小端。

常见取值

0小端

S 模式显式内存访问按小端解释;指令取指不受该位影响。

1大端

S 模式显式内存访问按大端解释;指令取指不受该位影响。

35:34

SXL

读写

RV64 中 S 模式有效 XLEN 编码。

这个字段控制什么

  • - RV64 中 S 模式有效 XLEN 编码。

常见取值

132 位

对应有效 XLEN=32。

264 位

对应有效 XLEN=64。

3保留

保留编码;可移植软件不应写入或依赖。

33:32

UXL

读写

RV64 中 U 模式有效 XLEN 编码。

这个字段控制什么

  • - RV64 中 U 模式有效 XLEN 编码。

常见取值

132 位

对应有效 XLEN=32。

264 位

对应有效 XLEN=64。

3保留

保留编码;可移植软件不应写入或依赖。

22

TSR

读写

为 1 时,S 模式执行 SRET 会陷入 M 模式。

这个字段控制什么

  • - 为 1 时,S 模式执行 SRET 会陷入 M 模式。

常见取值

00

S 模式执行 SRET 不因 TSR 置位而陷入。

11

S 模式执行 SRET 会触发非法指令异常。

21

TW

读写

为 1 时,低特权级 WFI 可被实现转为非法指令陷入。

这个字段控制什么

  • - 为 1 时,低特权级 WFI 可被实现转为非法指令陷入。

常见取值

00

低特权级 WFI 不因 TW 置位而被强制超时陷入。

11

低特权级 WFI 可在未及时完成时触发非法指令异常。

20

TVM

读写

为 1 时,S 模式访问 satp 或执行 SFENCE.VMA 会陷入。

这个字段控制什么

  • - 为 1 时,S 模式访问 satp 或执行 SFENCE.VMA 会陷入。

常见取值

00

S 模式可按通常规则访问 satp 并执行地址转换栅栏。

11

S 模式访问 satp 或执行 SFENCE.VMA/SINVAL.VMA 会陷入。

19

MXR

读写

允许从可执行页读取数据。

这个字段控制什么

  • - 允许从可执行页读取数据。

常见取值

00

Load 不能仅因为页可执行就读取该页。

11

Load 可从可执行页读取数据。

18

SUM

读写

允许 S 模式访问 U 页。

这个字段控制什么

  • - 允许 S 模式访问 U 页。

常见取值

00

S 模式不能访问 U=1 的页,除非还有其他架构规则允许。

11

S 模式可访问 U=1 的页,但执行取指仍受规范限制。

17

MPRV

读写

数据内存访问使用 MPP 指定的有效特权级。

这个字段控制什么

  • - 数据内存访问使用 MPP 指定的有效特权级。

常见取值

00

数据内存访问使用当前特权级。

11

数据内存访问按 MPP 指定的有效特权级执行。

16:15

XS

读写

额外用户扩展状态。

这个字段控制什么

  • - 额外用户扩展状态。

常见取值

0Off

对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。

1Initial

扩展状态处于初始值。

2Clean

扩展状态与内存中保存的上下文一致。

3Dirty

扩展状态可能已被修改,通常需要在上下文切换时保存。

14:13

FS

读写

浮点状态。

这个字段控制什么

  • - 浮点状态。

常见取值

0Off

对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。

1Initial

扩展状态处于初始值。

2Clean

扩展状态与内存中保存的上下文一致。

3Dirty

扩展状态可能已被修改,通常需要在上下文切换时保存。

12:11

MPP

读写

进入 M 模式 trap 前的特权级。

这个字段控制什么

  • - 进入 M 模式 trap 前的特权级。

常见取值

0U

陷入 M 模式前的特权级为 User。

1S

陷入 M 模式前的特权级为 Supervisor。

2保留

该编码保留;可移植软件不应写入或依赖。

3M

陷入 M 模式前的特权级为 Machine。

10:9

VS

读写

向量状态;控制向量指令和向量 CSR 是否可用并跟踪脏状态。

这个字段控制什么

  • - 向量状态;控制向量指令和向量 CSR 是否可用并跟踪脏状态。

常见取值

0Off

对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。

1Initial

扩展状态处于初始值。

2Clean

扩展状态与内存中保存的上下文一致。

3Dirty

扩展状态可能已被修改,通常需要在上下文切换时保存。

8

SPP

读写

进入 S 模式 trap 前的特权级。

这个字段控制什么

  • - 进入 S 模式 trap 前的特权级。

常见取值

0U

陷入 S 模式前的特权级为 User。

1S

陷入 S 模式前的特权级为 Supervisor。

7

MPIE

读写

进入 M 模式 trap 前的 MIE 值。

这个字段控制什么

  • - 进入 M 模式 trap 前的 MIE 值。

常见取值

00

进入 M 模式陷阱前 MIE 为 0,或保存的返回后中断状态为关闭。

11

进入 M 模式陷阱前 MIE 为 1,MRET 可按规则恢复。

6

UBE

读写

用户模式大小端控制;0=小端,1=大端。

这个字段控制什么

  • - 用户模式大小端控制;0=小端,1=大端。

常见取值

0小端

U 模式显式内存访问按小端解释;指令取指不受该位影响。

1大端

U 模式显式内存访问按大端解释;指令取指不受该位影响。

5

SPIE

读写

进入 S 模式 trap 前的 SIE 值。

这个字段控制什么

  • - 进入 S 模式 trap 前的 SIE 值。

常见取值

00

进入 S 模式陷阱前 SIE 为 0,或保存的返回后中断状态为关闭。

11

进入 S 模式陷阱前 SIE 为 1,SRET 可按规则恢复。

3

MIE

读写

M 模式全局中断使能。

这个字段控制什么

  • - M 模式全局中断使能。

常见取值

0关闭

当前在 M 模式运行时,Machine 全局中断关闭。

1开启

当前在 M 模式运行时,Machine 全局中断开启;具体递送还取决于 mie/mip 和委托状态。

1

SIE

读写

S 模式全局中断使能。

这个字段控制什么

  • - S 模式全局中断使能。

常见取值

0关闭

当前在 S 模式运行时,Supervisor 全局中断关闭。

1开启

当前在 S 模式运行时,Supervisor 全局中断开启;具体递送还取决于 sie/sip 和委托状态。

官方依据与检索要点

mstatus 是 Machine 状态、trap 与中断 CSR 中的 读写 CSR,地址为 0x300。先确认当前特权级和扩展实现情况,再根据位字段判断该 CSR 影响的架构状态。

mstatus 的地址、最低访问特权级和读写属性按官方 CSR 表核对:0x300,M模式,读写。
先按 Machine 状态、trap 与中断 CSR 理解它影响的架构状态,再看页面中的位字段说明。
写入前只修改目标字段并保留未修改位;WPRI/保留字段应按官方规范和实现返回值解释。

汇编操作示例

使用 csrr/csrw/csrs/csrc 指令读写 mstatus,参考 RISC-V Privileged Architecture §2.8

csrr t0, mstatus
读取完整的 mstatus 值到 t0
csrs mstatus, t0
原子设置 t0 中为 1 的位(用于开启 MIE 等)
csrc mstatus, t0
原子清除 t0 中为 1 的位(用于关闭 MIE)
li t0, 0x00002008; csrs mstatus, t0
开启 MIE(bit3)+设置 FS=Initial(bit13,01)

与其他 CSR 的关系

mstatus 是 M 模式的核心状态寄存器。sstatus 是 mstatus 中与 S 模式相关字段的受限视图,包括 SIE、SPIE、SPP、SUM、MXR 等字段。mstatus.MIE 控制 M 模式全局中断使能;M 模式中断还需要结合 mie/mip 和委托状态判断。FS/VS/XS 字段控制浮点/向量/扩展寄存器的上下文保存策略。

关键位字段速查

MIE(bit3) 全局中断使能 | MPIE(bit7) 陷阱前 MIE 的保存值 | MPP(bits12:11) 陷阱前特权模式(00=U,01=S,11=M) | FS(bits14:13) FPU 状态(00=Off,01=Initial,10=Clean,11=Dirty) | SD(XLEN-1;RV64 bit63,RV32 bit31) 状态脏位汇总(FS/VS/XS 任一为 Dirty 时置 1)

读这个 CSR 时先看什么

  • - 先确认当前 hart 是否实现 mstatus,未实现或权限不足的访问会触发非法指令异常。
  • - 结合地址 0x300 和最低访问特权级(Machine)判断软件是否可以直接读取。
  • - 读取保留位或 WARL/WLRL 位时不要假设固定值,应按规范和实现返回值解释。

写入前的风险检查

  • - 写入前保留未修改的位,避免把保留位或实现定义位写成非规范值。
  • - 优先使用 CSRRS/CSRRC 做局部置位或清位,避免 CSRRW 覆盖并发更新的状态位。

放回真实流程里理解

1

初始化或进入相关特权流程时,软件先读取 mstatus 了解当前状态。

2

根据字段定义只修改目标位,保留其余位的原值。

3

修改后再次读取或通过后续 trap/中断/上下文切换行为验证配置是否生效。

常见问题

mstatus 可以在任意特权级访问吗?

不能只看 CSR 名称判断。官方 CSR 地址编码和表格给出最低访问特权级;mstatus 当前记录为 M模式,权限不足或未实现时访问会触发非法指令异常。

写 mstatus 时最容易忽略什么?

不要把整个 CSR 当普通整数覆盖。应只修改目标字段,保留未修改位,并按规范处理 WARL、WLRL、WPRI 或保留字段。