跳到主要内容

The RISC-V Instruction Set Manual: Volume II: Privileged Architecture

· 阅读需 28 分钟
Jiang Sheng
Front End Engineer

记录学习时查阅的一些特权级文档规范。

翻译说明

本页为 RISC-V Privileged 架构手册部分内容的中文摘译,仅供学习参考,不具规范效力。

上游英文版本(可能较新,译文未必完全同步):

https://github.com/riscv/riscv-isa-manual/releases/tag/20250508

如用于实现 / 调试 / 合规,请务必核对英文原文;若发现差异或术语不一致,欢迎反馈。

Machine-Level ISA, Version 1.13

机器级 ISA,版本 1.13

本章描述在机器模式(Machine mode, M-mode)下可用的机器级操作,该模式是 RISC-V 硬件线程(hart)中的最高特权模式。M 模式用于对硬件平台的底层访问,并且在复位时首先进入。M 模式还可用于实现那些直接在硬件中实现过于困难或成本过高的功能。RISC-V 机器级 ISA 包含一个通用核心,其扩展取决于所支持的其他特权级以及硬件实现的其他细节。

Machine-Level CSRs

机器级 CSR

除本节所述的机器级 CSR(控制与状态寄存器)之外,M 模式代码可以访问较低特权级的所有 CSR。

Machine Trap-Vector Base-Address (mtvec) Register

机器陷入向量基址(mtvec)寄存器

mtvec 寄存器是一个 MXLEN 位的 WARL 可读写寄存器,用于保存陷入向量配置,由向量基址(BASE)和向量模式(MODE)组成。

mtvec.svg mtvec.svg

mtvec MODE 字段编码。

mtvec 寄存器必须始终实现,但其取值可以是只读的。若 mtvec 可写,其可取值集合可随实现而异。BASE 字段的取值必须始终按 4 字节边界对齐,且 MODE 设置可能对 BASE 的取值施加额外的对齐约束。注意,该 CSR 仅包含地址 BASE 的第 XLEN-1 到第 2 位;当作为地址使用时,低两位以零填充,从而得到始终按 4 字节边界对齐的 XLEN 位地址。

Encoding of mtvec MODE field.

ValueNameDescription
0
1
≥2
Direct
Vectored
---
All traps set pc to BASE.
Asynchronous interrupts set pc to BASE+4×cause.
Reserved

mtvec MODE 字段编码。

名称描述
0直接(Direct)所有陷入将 pc 设为 BASE。
1向量(Vectored)异步中断将 pc 设为 BASE+4×cause。
≥2---保留

MODE 字段的编码见「mtvec MODE 字段编码」。当 MODE=Direct 时,进入机器模式的所有陷入都会将 pc 设为 BASE 字段中的地址。当 MODE=Vectored 时,进入机器模式的所有同步异常将 pc 设为 BASE 字段中的地址,而中断则将 pc 设为 BASE 字段中的地址加上中断原因号的四倍。例如,机器态定时器中断(见「陷入后机器异常原因(mcause)寄存器取值」)会将 pc 设为 BASE+0x1c

实现可针对不同模式采用不同的对齐约束。尤其是,MODE=Vectored 可能比 MODE=Direct 需要更严格的对齐约束。

Machine Trap Delegation (medeleg and mideleg) Registers

机器陷入委派(medelegmideleg)寄存器

默认情况下,任意特权级发生的所有陷入都在机器模式处理,但机器态处理程序可以使用 MRET 指令(从陷入返回指令)将陷入重定向回适当的特权级。为提高性能,实现可以在 medelegmideleg 中提供独立的可读写位,用以指示某些异常和中断应直接由较低特权级处理。机器异常委派寄存器(medeleg)是一个 64 位可读写寄存器。机器中断委派寄存器(mideleg)是一个 MXLEN 位可读写寄存器。

在具有 S 模式的硬件线程(hart)上,必须提供 medelegmideleg 寄存器;当在 medelegmideleg 中设置某一位时,发生于 S 模式或 U 模式的相应陷入将被委派给 S 模式的陷入处理程序。在不支持 S 模式的 hart 上,不应提供 medelegmideleg 寄存器。

当某个陷入被委派给 S 模式时,scause 寄存器会被写入陷入原因;sepc 寄存器会被写入发生陷入的指令的虚拟地址;stval 寄存器会被写入与异常相关的特定数据;mstatus 的 SPP 字段会被写入陷入发生时的有效特权级;mstatus 的 SPIE 字段会被写入陷入发生时 SIE 字段的值;并且 mstatus 的 SIE 字段会被清零。mcausemepcmtval 寄存器以及 mstatus 的 MPP 与 MPIE 字段不会被写入。

实现可以选择仅支持委派陷入的一个子集。可通过对每个位位置写入 1,然后读回 medelegmideleg,以确定哪些位会保持为 1,从而发现支持的委派位。

实现不得将 medeleg 的任何位固定为只读 1,即任何可被委派的同步陷入必须支持不被委派。类似地,实现不得将对应于机器级中断的 mideleg 中的任何位固定为只读 1(但可以对较低级别的中断如此处理)。

陷入不会从更高特权级转换到更低特权级。例如,若 M 态已将非法指令异常委派给 S 态,而 M 态软件随后执行了非法指令,则该陷入仍在 M 态处理,而不会被委派至 S 态。相对地,陷入可以「横向」发生。沿用该示例,若 M 态已将非法指令异常委派给 S 态,而 S 态软件随后执行了非法指令,则该陷入在 S 态处理。

被委派的中断会在委派者的特权级被屏蔽。例如,若通过设置 mideleg[5] 将监督定时器中断(STI)委派给 S 态,则在执行于 M 态时不会响应 STI。相对地,若 mideleg[5] 为清零,则可在任意模式下响应 STI,且无论当前模式为何,都会将控制权转移到 M 态。

medeleg.svg medeleg.svg

机器异常委派(medeleg)寄存器。

medeleg 为「陷入后机器异常原因(mcause)寄存器取值」中列出的每个同步异常都分配了一个位位置,其位索引等于 mcause 寄存器返回的值(例如,设置第 8 位允许将用户态的环境调用委派给更低特权级的陷入处理程序)。

当 XLEN=32 时,medelegh 是一个 32 位可读写寄存器,别名映射 medeleg 的 63:32 位。XLEN=64 时不存在 medelegh 寄存器。

mideleg.svg mideleg.svg

机器中断委派(mideleg)寄存器。

mideleg 保存各个中断的陷入委派位,其位布局与 mip 寄存器一致(例如,监督定时器中断挂起(STIP)的委派控制位位于第 5 位)。

对于不可能在较低特权级出现的异常,相应的 medeleg 位应为只读 0。特别地,medeleg[11] 为只读 0。

由于双重陷入不可委派,medeleg[16] 为只读 0。

Machine Interrupt (mip and mie) Registers

机器中断(mipmie)寄存器

mip 寄存器是一个 MXLEN 位可读写寄存器,包含中断挂起信息,而 mie 是相应的 MXLEN 位可读写寄存器,包含中断使能位。中断原因号 i(由 CSR mcause 报告,见「机器异常原因(mcause)寄存器」)与 mipmie 的第 i 位一一对应。位 15:0 仅分配给标准中断原因,位 16 及以上保留给平台使用。

mideleg.svg mideleg.svg

机器中断挂起(mip)寄存器。

mideleg.svg mideleg.svg

机器中断使能(mie)寄存器

若满足以下全部条件,中断 i 将陷入到机器模式(使特权级切换为机器模式):(a) 当前特权级为 M 且 mstatus 中的 MIE 位置位,或当前特权级低于机器模式;(b) mipmie 的第 i 位均为 1;且 (c) 若存在 mideleg 寄存器,则 mideleg 的第 i 位为 0。

上述导致中断陷入的条件,必须在中断在 mip 中变为挂起或不再挂起后的有界时间内完成求值,并且在执行 xRET 指令之后,或在对这些中断陷入条件明确依赖的 CSR(包括 mipmiemstatusmideleg)进行显式写入之后,必须立即重新求值。

发往 M 模式的中断优先于发往较低特权级的任何中断。

mip 寄存器中的各独立位可以是可写的,也可以是只读的。当 mip 的第 i 位是可写时,可通过向该位写 0 来清除挂起的中断 i。如果中断 i 可能变为挂起,但 mip 的第 i 位为只读,则实现必须提供其他机制来清除此挂起中断。

若某中断在实现中可能出现挂起,则 mie 中对应的位必须是可写的。mie 中不可写的位必须为只读 0。

mipmie 的标准部分(位 15:0)格式分别如「mip 的标准部分(位 15:0)」与「mie 的标准部分(位 15:0)」所示。

mipreg-standard.svg mipreg-standard.svg

mip 的标准部分(位 15:0)。

miereg-standard.svg miereg-standard.svg

mie 的标准部分(位 15:0)。

mip.MEIP 与 mie.MEIE 分别是机器级外部中断的中断挂起位与中断使能位。mip 中的 MEIP 为只读,由平台特定的中断控制器置位与清零。

mip.MTIP 与 mie.MTIE 分别是机器定时器中断的中断挂起位与中断使能位。mip 中的 MTIP 为只读,通过写内存映射的机器模式定时器比较寄存器进行清除。

mip.MSIP 与 mie.MSIE 分别是机器级软件中断的中断挂起位与中断使能位。mip 中的 MSIP 为只读,其由对内存映射控制寄存器的访问写入,这些寄存器被远端硬件线程用于发出机器级核间中断。硬件线程也可使用相同的内存映射控制寄存器写自身的 MSIP 位。如果系统仅有一个硬件线程,或平台标准改为通过外部中断(MEI)投递机器级核间中断,则 mip.MSIP 与 mie.MSIE 均可为只读 0。

若未实现监督者模式,则 mip 的 SEIP、STIP、SSIP 与 mie 的 SEIE、STIE、SSIE 为只读 0。

若实现了监督者模式,则 mip.SEIP 与 mie.SEIE 分别是监督级外部中断的中断挂起位与中断使能位。mip 中的 SEIP 可写,M 模式软件可写此位以指示 S 模式存在一个外部中断挂起。此外,平台级中断控制器也可产生监督级外部中断。监督级外部中断的挂起状态由「软件可写 SEIP 位」与「来自外部中断控制器的信号」的逻辑或决定。当通过 CSR 指令读取 mip 时,写入目的寄存器 rd 的 SEIP 位值为软件可写位与外部中断控制器信号的逻辑或,但外部中断控制器的信号不用于计算写回至 SEIP 的值。只有软件可写的 SEIP 位参与 CSRRS 或 CSRRC 指令的读改写序列。

若实现了监督者模式,则 mip.STIP 与 mie.STIE 分别是监督级定时器中断的中断挂起位与中断使能位。mip 中的 STIP 可写,M 模式软件可以写此位以向 S 模式投递定时器中断。

若实现了监督者模式,则 mip.SSIP 与 mie.SSIE 分别是监督级软件中断的中断挂起位与中断使能位。mip 中的 SSIP 可写,也可由平台特定的中断控制器置为 1。

若实现了 Sscofpmf 扩展,则 mip.LCOFIP 与 mie.LCOFIE 分别是本地计数器溢出中断的中断挂起位与中断使能位。mip 中的 LCOFIP 为可读写,反映由于任一 mhpmeventn.OF 位置位而产生的本地计数器溢出中断请求的发生。若未实现 Sscofpmf 扩展,则 mip.LCOFIP 与 mie.LCOFIE 为只读 0。

同时到达且发往 M 模式的多个中断按如下降序优先级处理:MEI、MSI、MTI、SEI、SSI、STI、LCOFI。

mipmie 的受限视图分别作为监督级的 sipsie 寄存器出现。若在 mideleg 寄存器中设置了相应位以将某个中断委派给 S 模式,则该中断会在 sip 寄存器中可见,并可通过 sie 寄存器进行屏蔽;否则,sipsie 中对应位为只读 0。

Machine Scratch (mscratch) Register

机器态临时寄存器(mscratch)寄存器

mscratch 寄存器是一个 MXLEN 位可读写寄存器,供机器模式使用。典型用法是保存指向机器态硬件线程(hart)本地上下文空间的指针,并在进入 M 态陷入处理程序时与某个用户寄存器交换。

mscratch.svg mscratch.svg

机器模式临时寄存器。

Machine Exception Program Counter (mepc) Register

机器异常程序计数器(mepc)寄存器

mepc 是一个 MXLEN 位可读写寄存器,其格式见「机器异常程序计数器寄存器」。mepc 的最低位(mepc[0])始终为 0。对于仅支持 IALIGN=32 的实现,最低两位(mepc[1:0])始终为 0。

如果某实现允许通过更改 CSR misa(例如)在 IALIGN=16 与 IALIGN=32 之间切换,则每当 IALIGN=32 时,读取会对位 mepc[1] 做屏蔽,使其读为 0。MRET 指令进行的隐式读取同样会发生屏蔽。尽管被屏蔽,在 IALIGN=32 时 mepc[1] 仍是可写的。

mepcWARL 寄存器,必须能够保存所有有效的虚拟地址;不要求能够保存所有可能的无效地址。在写入 mepc 之前,实现可以将一个无效地址转换为 mepc 能够保存的另一个无效地址。

当陷入进入 M 态时,mepc 会被写入发生中断或异常的那条指令的虚拟地址。除此之外,实现不会写入 mepc,但软件可显式写入。

mepcreg.svg mepcreg.svg

机器异常程序计数器寄存器。

Machine Cause (mcause) Register

机器异常原因(mcause)寄存器

mcause 寄存器是一个 MXLEN 位可读写寄存器,其格式见「机器异常原因(mcause)寄存器」。当陷入进入 M 态时,mcause 会被写入一个指示导致此次陷入事件的编码。除此之外,实现不会写入 mcause,但软件可显式写入。

若陷入由中断引发,则 mcause 寄存器中的中断位(Interrupt bit)会被置位。异常编码(Exception Code)字段包含用于标识最近一次异常或中断的编码。「陷入后机器异常原因(mcause)寄存器取值」列出了可能的机器级异常编码。异常编码字段为 WLRL 字段,因此仅保证能保存受支持的异常编码。

mcausereg.svg mcausereg.svg

机器异常原因(mcause)寄存器。

注意,载入(load)与保留载入(load-reserved)指令会产生载入异常,而存储(store)、条件存储(store-conditional)与 AMO 指令会产生存储/AMO 异常。

如果一条指令可能引发多个同步异常,则应按照「同步异常优先级(降序)」中给出的降序优先级选择要被处理并记录到 mcause 的异常。任何自定义同步异常的优先级由实现自行定义。

Machine cause (mcause) register values after trap.

InterruptException CodeDescription
1
1
1
1
0
1
2
3
Reserved
Supervisor software interrupt
Reserved
Machine software interrupt
1
1
1
1
4
5
6
7
Reserved
Supervisor timer interrupt
Reserved
Machine timer interrupt
1
1
1
1
8
9
10
11
Reserved
Supervisor external interrupt
Reserved
Machine external interrupt
1
1
1
1
12
13
14-15
≥16
Reserved
Counter-overflow interrupt
Reserved
Designated for platform use
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20-23
24-31
32-47
48-63
≥64
Instruction address misaligned
Instruction access fault
Illegal instruction
Breakpoint
Load address misaligned
Load access fault
Store/AMO address misaligned
Store/AMO access fault
Environment call from U-mode
Environment call from S-mode
Reserved
Environment call from M-mode
Instruction page fault
Load page fault
Reserved
Store/AMO page fault
Double trap
Reserved
Software check
Hardware error
Reserved
Designated for custom use
Reserved
Designated for custom use
Reserved

陷入后机器异常原因(mcause)寄存器取值。

中断异常编码描述
10保留
11监督软件中断
12保留
13机器软件中断
14保留
15监督定时器中断
16保留
17机器定时器中断
18保留
19监督外部中断
110保留
111机器外部中断
112保留
113本地计数器溢出中断
114-15保留
1≥16指定用于平台使用
00指令地址未对齐
01指令访问错误
02非法指令
03断点
04载入地址未对齐
05载入访问错误
06存储/AMO 地址未对齐
07存储/AMO 访问错误
08来自 U 模式的环境调用
09来自 S 模式的环境调用
010保留
011来自 M 模式的环境调用
012指令页故障
013载入页故障
014保留
015存储/AMO 页故障
016双重陷入
017保留
018软件检查异常
019硬件错误
020-23保留
024-31指定用于自定义使用
032-47保留
048-63指定用于自定义使用
0≥64保留

Synchronous exception priority in decreasing priority order.

PriorityExc.CodeDescription
Highest3Instruction address breakpoint
12, 1During instruction address translation:
First encountered page fault or access fault
1With physical address for instruction:
Instruction access fault
2
0
8, 9, 11
3
3
Illegal instruction
Instruction address misaligned
Environment call
Environment break
Load/store/AMO address breakpoint
4, 6Optionally:
Load/store/AMO address misaligned
13, 15, 5, 7During address translation for an explicit memory access:
First encountered page fault or access fault
5, 7With physical address for an explicit memory access:
Load/store/AMO access fault
Lowest4, 6If not higher priority:
Load/store/AMO address misaligned

同步异常优先级(降序)。

优先级异常编码描述
最高3指令地址断点
在指令地址翻译期间:
12, 1首先遇到的页故障或访问错误
针对指令的物理地址:
1指令访问错误
2非法指令
0指令地址未对齐
8, 9, 11环境调用
3环境断点
3载入/存储/AMO 地址断点
可选:
4, 6载入/存储/AMO 地址未对齐
在对显式内存访问进行地址翻译期间:
13, 15, 5, 7首先遇到的页故障或访问错误
针对显式内存访问的物理地址:
5, 7载入/存储/AMO 访问错误
若未被更高优先级覆盖:
最低4, 6载入/存储/AMO 地址未对齐

当一个虚拟地址被翻译为物理地址时,地址翻译算法决定可能引发哪一种具体异常。

载入/存储/AMO 地址未对齐异常的优先级相对于载入/存储/AMO 页故障与访问错误异常,可以更高也可以更低。

Machine Trap Value (mtval) Register

机器陷入值(mtval)寄存器

mtval 寄存器是一个 MXLEN 位可读写寄存器,其格式见「机器陷入值(mtval)寄存器」。当陷入进入 M 态时,mtval 要么被写为 0,要么被写入与异常相关的特定信息,以帮助软件处理此次陷入。除此之外,实现不会写入 mtval,但软件可显式写入。硬件平台会规定哪些异常必须向 mtval 提供信息、哪些异常可以无条件写为 0、以及哪些异常可根据底层事件选择上述任一行为。如果硬件平台规定没有任何异常会向 mtval 写入非零值,则 mtval 为只读 0。

当在取指、载入或存储过程中发生断点、地址未对齐、访问错误或页故障异常且 mtval 被写入非零值时,mtval 将包含导致错误的虚拟地址。

当启用基于页的虚拟内存时,即便是物理内存访问错误异常,mtval 也会被写入导致错误的虚拟地址。该设计可降低大多数实现的数据通路成本,尤其是具备硬件页表遍历器的实现。

mtvalreg.svg mtvalreg.svg

机器陷入值(mtval)寄存器。

当一次未对齐的载入或存储导致访问错误或页故障异常且 mtval 被写入非零值时,mtval 将包含导致错误的那一部分访问的虚拟地址。

当在具有变长指令的硬件线程上发生指令访问错误或页故障异常且 mtval 被写入非零值时,mtval 将包含导致错误的那部分指令的虚拟地址,而 mepc 将指向该指令的起始位置。

mtval 寄存器还可以选择性地用于在非法指令异常时返回出错指令的指令位(mepc 指向内存中该出错指令)。若在非法指令异常发生时 mtval 被写入非零值,则 mtval 将包含以下三者中最短者:

  • 实际的出错指令

  • 出错指令的前 ILEN 位

  • 出错指令的前 MXLEN 位

在非法指令异常中装载到 mtval 的值是右对齐的,所有未使用的高位清零。

当陷入由软件检查异常引发时,mtval 寄存器保存该异常的原因。编码定义如下:

  • 0 - 未提供信息。

  • 2 - 着陆垫故障(Landing Pad Fault)。由 Zicfilp 扩展定义。

  • 3 - 影子栈故障(Shadow Stack Fault)。由 Zicfiss 扩展定义。

对于其他陷入,mtval 被置为 0,但未来标准可能会重新定义 mtval 在其他陷入下的取值。

如果 mtval 不是只读 0,则它是 WARL 寄存器,必须能够保存所有有效的虚拟地址以及数值 0;不要求能够保存所有可能的无效地址。在写入 mtval 之前,实现可以将一个无效地址转换为 mtval 能够保存的另一个无效地址。若实现了返回出错指令位的特性,mtval 还必须能保存所有小于 2N 的值,其中 N 为 MXLEN 与 ILEN 中较小者。

Machine-Mode Privileged Instructions

机器态特权指令

Environment Call and Breakpoint

环境调用与断点

mm-env-call.svg mm-env-call.svg

ECALL 指令用于向支撑的执行环境发起请求。当在 U 模式、S 模式或 M 模式下执行时,分别产生「来自 U 模式的环境调用异常」「来自 S 模式的环境调用异常」或「来自 M 模式的环境调用异常」,且不执行其他操作。

EBREAK 指令由调试器使用,用于将控制权转移回调试环境。除非被外部调试环境改写,否则 EBREAK 将引发断点异常,且不执行其他操作。

ECALL 与 EBREAK 会使接收特权级的 epc 寄存器被设置为 ECALL 或 EBREAK 指令自身的地址,而非其后一条指令的地址。由于 ECALL 与 EBREAK 会引发同步异常,它们不被视为已退役,且不应使 minstret CSR 递增。

Trap-Return Instructions

从陷入返回指令

用于从陷入返回的指令在 PRIV 次操作码下编码。

trap-return.svg trap-return.svg

为在处理陷入后返回,每个特权级分别提供了从陷入返回指令:MRET 与 SRET。MRET 始终提供;若支持监督者模式,则必须提供 SRET,否则应引发非法指令异常。当 mstatus 中 TSR=1 时,SRET 也应引发非法指令异常,详见「Virtualization Support in mstatus Register」。xRET 指令可在特权级 x 或更高特权级执行;在更高特权级执行较低特权级的 xRET 将弹出相应较低特权级的中断使能与特权级栈。尝试在低于 x 的特权级执行 xRET 会引发非法指令异常。除按「Privilege and Global Interrupt-Enable Stack in mstatus register」所述操作特权栈之外,xRET 还会将 pc 设为 xepc 寄存器中保存的值。

若支持 A 扩展,xRET 指令允许清除任何尚未完成的 LR 地址保留,但并非必须清除。若需要,陷入处理程序应在执行 xRET 前显式清除该保留(例如使用一次空操作的 SC)。

Wait for Interrupt

等待中断(WFI)

等待中断指令(WFI)告知实现:当前硬件线程(hart)可被挂起,直到可能需要服务某个中断。执行 WFI 也可用于告知硬件平台:应优先将合适的中断路由至该硬件线程。WFI 在所有特权级均可用,并可选择性地在 U 模式可用。当 mstatus 中 TW=1 时,该指令可能引发非法指令异常,详见「Virtualization Support in mstatus Register」。

wfi.svg wfi.svg

若在硬件线程挂起期间有一个已使能的中断已挂起或随后变为挂起,则将在下一条指令处进入该中断的陷入处理,即执行从陷入处理程序处恢复,且 mepc = pc+4。

即便没有任何已使能的中断变为挂起,实现也允许因任何原因恢复执行。因此,将 WFI 实现为一个 NOP(空操作)也是合法实现。

在中断被禁用时也可以执行 WFI。WFI 的行为不得受 mstatus 中全局中断位(MIE 与 SIE)以及委派寄存器 mideleg 的影响(即:即使某个中断已被委派到更低特权级,只要本地使能且变为挂起,硬件线程也必须恢复);但应遵循各个单独中断的使能位(例如 MTIE)(即:若某中断已挂起但未单独使能,实现应避免恢复硬件线程)。无论各特权级的全局中断使能为何,WFI 还要求对任一特权级上本地已使能且挂起的中断恢复执行。

如果导致硬件线程恢复执行的事件并未引发中断进入,则执行将在 pc+4 处继续,软件必须自行决定后续动作,包括在没有可处理事件时回跳并重试 WFI。

Supervisor-Level ISA, Version 1.13

监督者级 ISA,版本 1.13

本章描述 RISC-V 监督者级架构,该架构包含一个通用核心,可与各种监督者级地址转换和保护方案配合使用。

Supervisor Instructions

监督者指令

除了「从陷入返回指令」中定义的 SRET 指令外,还提供了一条新的监督者级指令。

Supervisor Memory-Management Fence Instruction

监督者内存管理栅栏指令

sfencevma.svg sfencevma.svg

监督者内存管理栅栏指令 SFENCE.VMA 用于将内存中内存管理数据结构的更新与当前执行同步。指令执行会导致对这些数据结构的隐式读取和写入;然而,这些隐式引用通常不会相对于显式载入和存储进行排序。执行 SFENCE.VMA 指令可保证当前 RISC-V 硬件线程已可见的任何先前存储,在该硬件线程后续指令对内存管理数据结构的某些隐式引用之前被排序。SFENCE.VMA 排序的具体操作集合由 rs1rs2 决定,如下所述。SFENCE.VMA 还用于使与硬件线程关联的地址转换缓存中的条目无效(参见「Virtual Address Translation Process」)。有关此指令行为的更多详细信息,请参见「在 mstatus 寄存器中的虚拟化支持」和「Physical Memory Protection and Paging」。

SFENCE.VMA 仅对本地硬件线程对内存管理数据结构的隐式引用进行排序。

对于转换数据结构仅针对单个地址映射(即一个页或超页)被修改的常见情况,rs1 可以指定该映射内的虚拟地址,以仅对该映射执行转换栅栏。此外,对于转换数据结构仅针对单个地址空间标识符被修改的常见情况,rs2 可以指定地址空间。SFENCE.VMA 的行为取决于 rs1rs2,如下所示:

  • 如果 rs1=x0rs2=x0,该栅栏对所有地址空间的任何级别页表的所有读取和写入进行排序。该栅栏还使所有地址空间的所有地址转换缓存条目无效。

  • 如果 rs1=x0rs2x0,该栅栏对任何级别页表的所有读取和写入进行排序,但仅针对由整数寄存器 rs2 标识的地址空间。对 全局 映射(参见「Addressing and Memory Protection」)的访问不进行排序。该栅栏还使与整数寄存器 rs2 标识的地址空间匹配的所有地址转换缓存条目无效,但包含全局映射的条目除外。

  • 如果 rs1x0rs2=x0,该栅栏仅对所有地址空间中与 rs1 中虚拟地址对应的叶页表项的读取和写入进行排序。该栅栏还使所有地址空间中包含与 rs1 中虚拟地址对应的叶页表项的所有地址转换缓存条目无效。

  • 如果 rs1x0rs2x0,该栅栏仅对由整数寄存器 rs2 标识的地址空间中与 rs1 中虚拟地址对应的叶页表项的读取和写入进行排序。对全局映射的访问不进行排序。该栅栏还使包含与 rs1 中虚拟地址对应的叶页表项且与整数寄存器 rs2 标识的地址空间匹配的所有地址转换缓存条目无效,但包含全局映射的条目除外。

如果 rs1 中保存的值不是有效的虚拟地址,则 SFENCE.VMA 指令无效。在这种情况下不会引发异常。

rs2x0 时,rs2 中保存的值的 SXLEN-1:ASIDMAX 位保留供未来标准使用。在标准扩展定义其用途之前,软件应将它们清零,当前实现应忽略它们。此外,如果 ASIDLEN<ASIDMAX,实现应忽略 rs2 中保存的值的 ASIDMAX-1:ASIDLEN 位。

对内存管理数据结构的隐式读取可能返回自最近一次包含该地址的 SFENCE.VMA 以来任何时刻有效的地址转换。SFENCE.VMA 隐含的排序不会以与标准 RVWMO 排序规则清晰交互的方式将对内存管理数据结构的隐式读取和写入放入全局内存序中。特别是,即使 SFENCE.VMA 将先前的显式访问排序在后续隐式访问之前,并且这些隐式访问排序在其关联的显式访问之前,SFENCE.VMA 也不一定将先前的显式访问排序在全局内存序中后续显式访问之前。这些隐式载入也不必在对同一地址的先前载入或存储方面遵守正常的程序序语义。

实现必须仅对 satp 寄存器的当前内容或后续有效(V=1)转换数据结构条目所指向的转换数据结构执行隐式读取,并且必须仅对作为指令执行结果生成的隐式访问引发异常,而不是对推测执行的隐式访问引发异常。

sstatus 字段 SUM 和 MXR 的更改立即生效,无需执行 SFENCE.VMA 指令。将 satp.MODE 从 Bare 更改为其他模式以及反之亦然也立即生效,无需执行 SFENCE.VMA 指令。同样,对 satp.ASID 的更改立即生效。

如果硬件线程使用地址转换缓存,该缓存必须看起来是该硬件线程私有的。特别是,ASID 的含义对于硬件线程是本地的;软件可以选择使用相同的 ASID 来引用不同硬件线程上的不同地址空间。

对于使 satp.MODE 只读为零(始终为 Bare)的实现,尝试执行 SFENCE.VMA 指令可能会引发非法指令异常。