CSR 位字段

RISC-V satp CSR 寄存器详解

地址 0x180特权级 S模式访问 读写 / SXLENSupervisor 地址转换与内存保护 CSR

satp(0x180)是 SXLEN 位 Supervisor 读写 CSR,保存根页表 PPN、ASID,并用 MODE 选择地址转换方案。

字段映射

按 bit 字段理解 satp

3 个关键字段
63:60

MODE

WARL

RV64 WARL 地址转换模式。实现不必支持全部模式;写入不支持的 MODE 时,satp 的所有字段均保持不变。

这个字段控制什么

  • - RV64 WARL 地址转换模式。实现不必支持全部模式;写入不支持的 MODE 时,satp 的所有字段均保持不变。

常见取值

0Bare

无分页地址转换;选择 Bare 时其余字段必须写 0。

1-7保留

RV64 satp.MODE 的保留编码;可移植软件不应写入或依赖。

8Sv39

启用 Sv39 页式虚拟内存。

9Sv48

启用 Sv48 页式虚拟内存。

10Sv57

启用 Sv57 页式虚拟内存。

11Sv64(预留)

当前版本中作为未来 Sv64 方案预留。

12-13保留

保留供未来标准使用。

14-15自定义用途

指定供自定义用途;没有标准、可移植的地址转换语义。

59:44

ASID

WARL

RV64 地址空间标识符,支持按地址空间执行转换栅栏。ASIDLEN 可为 0,最多为 16;从最低有效位起实现。

这个字段控制什么

  • - RV64 地址空间标识符,支持按地址空间执行转换栅栏。ASIDLEN 可为 0,最多为 16;从最低有效位起实现。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

43:0

PPN

WARL

RV64 根页表的 Supervisor 物理页号,即其物理地址除以 4 KiB;该 WARL 字段不一定能表示全部物理页号。

这个字段控制什么

  • - RV64 根页表的 Supervisor 物理页号,即其物理地址除以 4 KiB;该 WARL 字段不一定能表示全部物理页号。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

官方依据与检索要点

satp 是 SXLEN 位 Supervisor 读写 CSR,把 WARL MODE、ASID 与根页表 PPN 放在同一寄存器中,以便原子切换地址空间。

官方 CSR 表与 Supervisor ISA 第 12.1.11 节给出地址 0x180、SRW 访问类和 SXLEN 宽度。
图 31/32 将 MODE、ASID 和 PPN 都标为 WARL;写入不支持的 MODE 时整个寄存器保持不变。
写 satp 不隐含页表更新排序或地址转换缓存失效;修改页表或复用 ASID 时可能需要 SFENCE.VMA。

读这个 CSR 时先看什么

  • - satp 是地址 0x180 的 SXLEN 位 SRW CSR;U 模式不能直接访问。
  • - 在 S 模式下,mstatus.TVM=1 时读取或写入 satp 会触发非法指令异常。
  • - 可向 ASID 全部位写 1 后读回来探测 ASIDLEN;实现从 ASID 的最低有效位开始提供可写位。

写入前的风险检查

  • - 选择 Bare 时必须把其余位写 0;Bare 与非零其余位的组合会使其余字段值以及地址转换和保护行为均为 UNSPECIFIED。
  • - 对于 Bare 且其余位非零的编码,RV32 中 ASID[8:7]=3 的编码指定为自定义用途,其余编码保留供未来标准使用;RV64 中这些编码全部保留供未来标准使用。
  • - 若 MODE 不受支持,整次 satp 写入无效,MODE、ASID 和 PPN 都不改变。
  • - 写 satp 不排序页表更新,也不失效地址转换缓存;修改页表或复用 ASID 时按规范在适当位置执行 SFENCE.VMA。

放回真实流程里理解

1

确定实现支持的 MODE 和 ASIDLEN,并准备按 4 KiB 页号表示的根页表 PPN。

2

在一次 satp 写入中同时更新 MODE、ASID 和 PPN;若选择 Bare,则将其余位全部写 0。

3

根据页表是否已修改或 ASID 是否复用,在写 satp 前后按需执行匹配的 SFENCE.VMA。

常见问题

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

不能。它是 SRW CSR,U 模式不能直接访问;S 模式下若 mstatus.TVM=1,读写 satp 也会触发非法指令异常。

写 satp 时最容易忽略什么?

写 satp 不会自动刷新地址转换缓存,也不会排序先前的页表更新;此外,选择 Bare 时其余位必须为 0,写入不支持的 MODE 时整次写入无效。