Skip to content

Latest commit

 

History

History
57 lines (41 loc) · 9.03 KB

第十章笔记.md

File metadata and controls

57 lines (41 loc) · 9.03 KB

包含了第十章大部分内容,但是没有摘录具体的寄存器排布、图表与例子
RISC-V一共有三种权限模式,机器模式(M)、监管者模式(S)和用户模式(U)。M模式拥有完全的指令权限,是处理器必须实现的。S模式旨在支持现代类 Unix 操作系统,提供了异常委托和虚拟内存功能。U模式用于运行不可信代码,在执行高权限指令或访问被允许之外的内存地址时会产生异常

XLEN 指整数寄存器的宽度(以位为单位)。对于 RV32,XLEN 为 32;对 RV64,XLEN 则是 64。

机器模式(M)

机器模式(缩写为 M 模式,M-mode)是 RISC-V 中 hart(hardware thread,硬件线程)可以执行的最高权限模式。在 M 模式下运行的 hart 对内存,I/O 和一些对于启动和配置系统来说必要的底层功能有着完全的使用权。因此它是唯一所有标准 RISC-V 处理器都必须实现的权限模式。
机器模式最重要的特性是拦截和处理异常(不寻常的运行时事件)的能力。RISC-V 中实现精确例外:保证异常之前的所有指令都完整地执行了,而后续的指令都没有开始执行(或等同于没有执行)。

有三种标准的中断源:软件、时钟和外部来源:

  • 软件中断通过向内存映射寄存器中存数来触发,并通常用于由一个 hart 中断另一个 hart(在其他架构中称为处理器间中断机制)。
  • 当实时计数器 mtime 大于 hart 的时间比较器(一个名为 mtimecmp 的内存映射寄存器)时,会触发时钟中断。
  • 外部中断由平台级中断控制器(大多数外部设备连接到这个中断控制器)引发。

异常处理

八个控制状态寄存器(CSR)是机器模式下异常处理的必要部分:

  • mtvec(Machine Trap Vector)它保存发生异常时处理器需要跳转到的地址。
  • mepc(Machine Exception PC)它指向发生异常的指令。
  • mcause(Machine Exception Cause)它指示发生异常的种类。
  • mie(Machine Interrupt Enable)它指出处理器目前能处理和必须忽略的中断。
  • mip(Machine Interrupt Pending)它列出目前正准备处理的中断。
  • mtval(Machine Trap Value)它保存了陷入(trap)的附加信息:地址例外中出错 的地址、发生非法指令例外的指令本身,对于其他异常,它的值为 0。
  • mscratch(Machine Scratch)它暂时存放一个字大小的数据。
  • mstatus(Machine Status)它保存全局中断使能,以及许多其他的状态

处理器在 M 模式下运行时,只有在全局中断使能位 mstatus.MIE 置 1 时才会产生中断.此外,每个中断在控制状态寄存器 mie 中都有自己的使能位。
M 模式提供了一条指令:wfi(Wait ForInterrupt)。wfi 通知处理器目前没有任何有用的工作,所有它应该进入低功耗模式,直到任何使能有效的中断等待处理,即mie&mip ≠ 0。RISC-V 处理器以多种方式实现该指令,包括到中断待处理之前都停止时钟。有的时候只把这条指令当作 nop 来执行。因此,wfi 通常在循环内使用。wfi 不论全局中断使能有效与否都有用

用户模式(U)

用户模式(U 模式)。在尝试执行 M 模式指令或访问 CSR 的时候产生非法指令异常。其它时候,U 模式和 M 模式的表现十分相似。通过将 mstatus.MPP 设置为 U,然后执行 mret 指令,软件可以从 M 模式进入 U 模式。如果在 U 模式下发生异常,则把控制移交给 M 模式。
实现了 M 和 U 模式的处理器具有一个叫做物理内存保护(PMP,Physical Memory Protection)的功能,允许 M 模式指定 U 模式可以访问的内存地址。PMP 包括几个地址寄存器(通常为 8 到 16 个)和相应的配置寄存器。这些配置寄存器可以授予或拒绝读、写和执行权限。当处于 U 模式的处理器尝试取指或执行 load 或 store 操作时,将地址和所有的 PMP 地址寄存器比较。如果地址大于等于 PMP 地址 i,但小于 PMP 地址 i+1,则 PMP i+1 的配置寄存器决定该访问是否可以继续,如果不能将会引发访问异常。

监管者模式(S)

PMP 方案对嵌入式系统的实现很有吸引力,因为它以相对较低的成本提供了内存保护,但它的一些缺点限制了它在通用计算中的使用。
由于 PMP 仅支持固定数量的内存区域,因此无法对它进行扩展从而适应复杂的应用程序。而且由于这些区域必须在物理存储中连续,因此系统可能产生存储碎片化的问题。另外,PMP 不能有效地支持对辅存的分页。

更复杂的 RISC-V 处理器用和几乎所有通用架构相同的方式处理这些问题:使用基于页面的虚拟内存。这个功能构成了监管者模式(S 模式)的核心,这是一种可选的权限模式,旨在支持现代类 Unix 操作系统。S 模式比 U 模式权限更高,但比 M 模式低。与 U 模式一样,S 模式下运行的软件不能使用 M 模式的 CSR 和指令,并且受到 PMP 的限制。

RISC-V 提供了一种异常委托机制。通过该机制可以选择性地将中断和同步异常交给 S 模式处理,而不需要经过 M 模式移交。
mideleg(Machine Interrupt Delegation,机器中断委托)CSR 控制将哪些中断委托给 S模式。与 mip 和 mie 一样,mideleg 中的每个位对应相同的异常。委托给 S 模式的任何中断都可以被 S 模式的软件屏蔽。sie(Supervisor Interrupt Enable,监管者中断使能)和 sip(Supervisor Interrupt Pending,监管者中断待处理)CSR 是 S 模式的控制状态寄存器,他们是 mie 和 mip 的子集。它们有着和 M 模式下相同的布局,但在 sie 和 sip 中只有与由 mideleg 委托的中断对应的位才能读写。那些没有被委派的中断对应的位始终为零。
M 模式还可以通过 medeleg CSR 将同步异常委托给 S 模式。该机制类似于刚才提到的中断委托,但 medeleg 中的位对应的不再是中断,而是同步异常编码。无论委派设置是怎样的,发生异常时控制权都不会移交给权限更低的模式。在 M 模式下发生的异常总是在 M 模式下处理。在 S 模式下发生的异常,根据具体的委派设置,可能由 M 模式或 S 模式处理,但永远不会由 U 模式处理。
S 模式处理例外的行为和 M 模式非常相似。如果 hart 接受了异常并且把它委派给了 S 模式,则硬件会原子地经历几个类似的状态转换,其中用到了 S 模式而不是 M 模式的 CSR

虚拟内存

S 模式提供了一种传统的虚拟内存系统,它将内存划分为固定大小的页来进行地址转换和对内存内容的保护。启用分页的时候,大多数地址(包括 load 和 store 的有效地址和 PC 中的地址)都是虚拟地址。要访问物理内存,它们必须被转换为真正的物理地址,这通过遍历一种称为页表的高基数树实现。页表中的叶节点指示虚地址是否已经被映射到了真正的物理页面,如果是,则指示了哪些权限模式和通过哪种类型的访问可以操作这个页。访问未被映射的页或访问权限不足会导致页错误例外(page fault exception)。
RISC-V 的分页方案以 SvX 的模式命名,其中 X 是以位为单位的虚拟地址的长度。RV32 的分页方案 Sv32 支持 4GiB 的虚址空间,这些空间被划分为 2^10 个 4 MiB 大小的巨页。每个巨页被进一步划分为 2^10 个 4 KiB 大小的基页(分页的基本单位)。因此,Sv32 的页表是基数为 2^10 的两级树结构。页表中每个项的大小是四个字节,因此页表本身的大小是 4 KiB。页表的大小和每个页的大小完全相同,这样的设计简化了操作系统的内存分配。

一个叫 satp(Supervisor Address Translation and Protection,监管者地址转换和保护)的 S 模式控制状态寄存器控制了分页系统。satp 有三个域。MODE 域可以开启分页并选择页表级数。ASID(Address Space Identifier,地址空间标识符)域是可选的,它可以用来降低上下文切换的开销。最后,PPN 字段保存了根页表的物理地址,它以 4 KiB 的页面大小为单位。通常 M 模式的程序在第一次进入 S 模式之前会把零写入 satp 以禁用分页,然后 S 模式的程序在初始化页表以后会再次进行 satp 寄存器的写操作。
如果所有取指,load 和 store 操作都导致多次页表访问,那么分页会大大地降低性能!所有现代的处理器都用地址转换缓存(通常称为 TLB,全称为 Translation Lookaside Buffer)来减少这种开销。为了降低这个缓存本身的开销,大多数处理器不会让它时刻与页表保持一致。这意味着如果操作系统修改了页表,那么这个缓存会变得陈旧而不可用。S 模式添加了另一条指令来解决这个问题。这条 sfence.vma 会通知处理器,软件可能已经修改了页表,于是处理器可以相应地刷新转换缓存。