CSR 位字段

RISC-V sstatus CSR 寄存器详解

地址 0x100特权级 S模式访问 读写 / XLENSupervisor 状态、trap 与中断 CSR

监管者状态寄存器,mstatus中与S模式相关的字段子集视图。

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

按 bit 字段理解 sstatus

11 个关键字段
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 状态。

33:32

UXL

读写

RV64 中 U 模式有效 XLEN 编码。

这个字段控制什么

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

常见取值

132 位

对应有效 XLEN=32。

264 位

对应有效 XLEN=64。

3保留

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

19

MXR

读写

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

这个字段控制什么

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

常见取值

0关闭

Load 只能从可读页读取;MXR 对未启用分页地址转换时无影响。

1开启

Load 可从可读页或可执行页读取;MXR 对未启用分页地址转换时无影响。

18

SUM

读写

允许 S 模式访问 U 页。

这个字段控制什么

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

常见取值

0关闭

S 模式访问 U=1 的页会 fault;SUM 对未启用分页地址转换时无影响。

1开启

S 模式 load/store 可访问 U=1 的页;S 模式仍不能从用户页取指。

16:15

XS

读写

额外用户扩展状态。

这个字段控制什么

  • - 额外用户扩展状态。

常见取值

0Off

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

1Initial

扩展状态处于初始值。

2Clean

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

3Dirty

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

14:13

FS

读写

浮点状态。

这个字段控制什么

  • - 浮点状态。

常见取值

0Off

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

1Initial

扩展状态处于初始值。

2Clean

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

3Dirty

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

10:9

VS

读写

向量状态;是 mstatus.VS 的 S 模式视图。

这个字段控制什么

  • - 向量状态;是 mstatus.VS 的 S 模式视图。

常见取值

0Off

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

1Initial

扩展状态处于初始值。

2Clean

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

3Dirty

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

8

SPP

读写

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

这个字段控制什么

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

常见取值

0U

陷入 S 模式前的特权级为 User;SRET 返回到 U 模式。

1S

陷入 S 模式前的特权级为 Supervisor;SRET 返回到 S 模式。

6

UBE

读写

U 模式显式内存访问字节序控制。

这个字段控制什么

  • - U 模式显式内存访问字节序控制。

常见取值

0小端

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

1大端

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

5

SPIE

读写

进入 S 模式 trap 前的 SIE 值。

这个字段控制什么

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

常见取值

00

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

11

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

1

SIE

读写

S 模式全局中断使能。

这个字段控制什么

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

常见取值

0关闭

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

1开启

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

官方依据与检索要点

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

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

汇编操作示例

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

csrr t0, sstatus
在 S 模式下读取 sstatus(受限视图)
csrs sstatus, t0
设置 sstatus 中的使能位(如开启 SIE)
li t0, 0x00000002; csrs sstatus, t0
开启 SIE(bit1)——允许 S 模式中断

与其他 CSR 的关系

sstatus 是 mstatus 中 S 模式相关字段的受限视图——S 模式软件通过 sstatus 操作自身特权级可见字段。S 模式中断是否进入,取决于当前特权级、sstatus.SIE 以及 sip/sie 中对应挂起与使能位;不要把它简化成由 mstatus.MIE 控制。陷阱进入时硬件将 SIE 保存到 SPIE,并清零 SIE;sret 执行时从 SPIE 恢复到 SIE。

关键位字段速查

SIE(bit1) S模式中断使能 | SPIE(bit5) 陷阱前SIE保存值 | SPP(bit8) 陷阱前特权模式(0=U,1=S) | SUM(bit18) 允许S模式访问U模式内存 | MXR(bit19) 使可执行页可读

读这个 CSR 时先看什么

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

写入前的风险检查

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

放回真实流程里理解

1

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

2

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

3

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

常见问题

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

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

写 sstatus 时最容易忽略什么?

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