提交 72c96da8 编写于 作者: 两万多's avatar 两万多

2021/7/21

上级 2ab02345
......@@ -84,4 +84,32 @@ RV32A 有两种类型的原子操作:
## 压缩指令
![image-20210718221803270](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210718221803270.png)
\ No newline at end of file
![image-20210718221803270](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210718221803270.png)
## 向量
最著名的数据级并行架构是单指令多数据(SIMD,Single Instruction Multiple Data)。 SIMD 最初的流行是因为它将 64 位寄存器的数据分成许多个 8 位、16 位或 32 位的部分, 然后并行地计算它们。操作码提供了数据宽度和操作类型。数据传输只用单个(宽)SIMD 寄存器的 load 和 store 进行。
一个更老的,并且在我们看来更优雅的,利用数据级并行性的方案是向量架构。将向量的长度和每个时钟周期可以进行的最大操作数分 离,是向量体系结构的关键所在:向量微架构可以灵活地设计数据并行硬件而不会影响到 程序员,程序员可以不用重写代码就享受到长向量带来的好处。
![image-20210721161737464](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210721161737464.png)
### 向量寄存器和动态类型
RV32V 添加了 32 个向量寄存器,它们的名称以 v 开头,但每个向量寄存器的元素个 数不同。该数量取决于操作的宽度和专用于向量寄存器的存储大小,而这取决于处理器的 设计者。比方说,如果处理器为向量寄存器分配了 4096 个字节,则这足以让这些 32 个向 量寄存器中有 16 个 64 位元素,或者 32 个 32 位元素,或者 64 个 16 位元素,或 128 个 8 位元素。 为了在向量 ISA 中保持元素数量的灵活性,向量处理器会计算会最大向量长度 (mvl),即在给定的容量限制下,向量程序使用这个向量寄存器可以运算的最大向量长 度。向量长度寄存器(vl)为特定操作设定了向量中含有的元素数量,这有助于数组维度 不是 mvl 的整数倍时的编程。
**补充说明:**RV32V 可以快速切换上下文 向量架构不如 SIMD 架构受欢迎的一个原因是:大家担心增加大型向量寄存器会延长中断 时保存和恢复程序(上下文切换)的时间。动态寄存器类型对此很有帮助。程序员必须告诉 处理器正在使用哪些向量寄存器,这意味着处理器需要在上下文切换中仅保存和恢复那些 寄存器。
## RV64:64 位地址指令
要切换 到 64 位 ISA,ISA 只添加了少数指令。指令集只添加了 32 位指令对应的字(word),双字 (doubleword)和长整数(long)版本的指令,并将所有寄存器(包括 PC)扩展为 64 位。因此, RV64I 中的 sub 操作的是两个 64 位数字而不是 RV32I 中的 32 位数字。RV64 很接近 RV32 但实际上又有所不同;它添加了少量指令同时基础指令做的事情与 RV32 中稍有不同。
![image-20210721164350689](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210721164350689.png)
![image-20210721164435962](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210721164435962.png)
![image-20210721164447253](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210721164447253.png)
![image-20210721164500069](C:\Users\Leedia\AppData\Roaming\Typora\typora-user-images\image-20210721164500069.png)
\ No newline at end of file
## 简单嵌入式系统的机器模式
机器模式(缩写为 M 模式,M-mode)是 RISC-V 中 hart(hardware thread,硬件线 程)可以执行的最高权限模式。在 M 模式下运行的 hart 对内存,I/O 和一些对于启动和配 置系统来说必要的底层功能有着完全的使用权。因此它是唯一所有标准 RISC-V 处理器都 必须实现的权限模式。实际上简单的 RISC-V 微控制器仅支持 M 模式。
机器模式最重要的特性是拦截和处理异常(不寻常的运行时事件)的能力。RISC-V 将 异常分为两类。一类是同步异常,这类异常在指令执行期间产生,如访问了无效的存储器 地址或执行了具有无效操作码的指令时。另一类是中断,它是与指令流异步的外部事件, 比如鼠标的单击。
wfi(Wait For Interrupt) 通知处理器目前没有任何有用的工作,所有它应该进入低功耗模式, 直到任何使能有效的中断等待处理,即mie&mip ≠ 0。RISC-V 处理器以多种方式实现 该指令,包括到中断待处理之前都停止时钟。有的时候只把这条指令当作 nop 来执 行。因此,wfi 通常在循环内使用。
## 嵌入式系统中的用户模式和进程隔离
必须禁止不可信的代码执行特权指令(如 mret)和访问特权控制状态寄存器(如 mstatus),因为这将允许程序控制系统。这样的限制很容易实现,只要加入一种额外的权 限模式:用户模式(U 模式)。这种模式拒绝使用这些功能,并在尝试执行 M 模式指令或 访问 CSR 的时候产生非法指令异常。其它时候,U 模式和 M 模式的表现十分相似。通过 将 mstatus.MPP 设置为 U(编码为 0),然后执行 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 的配置寄存器决定该访问是否 可以继续,如果不能将会引发访问异常。
## 现代操作系统的监管者模式
上一节中描述的 PMP 方案对嵌入式系统的实现很有吸引力,因为它以相对较低的成本 提供了内存保护,但它的一些缺点限制了它在通用计算中的使用。由于 PMP 仅支持固定数 量的内存区域,因此无法对它进行扩展从而适应复杂的应用程序。而且由于这些区域必须 在物理存储中连续,因此系统可能产生存储碎片化的问题。另外,PMP 不能有效地支持对 辅存的分页。
更复杂的 RISC-V 处理器用和几乎所有通用架构相同的方式处理这些问题:使用基于 页面的虚拟内存。这个功能构成了*<u>监管者模式</u>*(S 模式)的核心,这是一种可选的权限模 式,旨在支持现代类 Unix 操作系统,如 Linux,FreeBSD 和 Windows。S 模式比 U 模式权 限更高,但比 M 模式低。与 U 模式一样,S 模式下运行的软件不能使用 M 模式的 CSR 和 指令,并且受到 PMP 的限制。
默认情况下,发生所有异常(不论在什么权限模式下)的时候,控制权都会被移交到 M 模式的异常处理程序。但是 Unix 系统中的大多数例外都应该进行 S 模式下的系统调 用。M 模式的异常处理程序可以将异常重新导向 S 模式,但这些额外的操作会减慢大多数 异常的处理速度。因此,RISC-V 提供了一种*<u>异常委托机制</u>*。通过该机制可以选择性地将中 断和同步异常交给 S 模式处理,而完全绕过 M 模式。
mideleg(Machine Interrupt Delegation,机器中断委托)CSR 控制将哪些中断委托给 S 模式。
委托给 S 模式的任何中断都可以被 S 模式的软件屏蔽。sie(Supervisor Interrupt Enable,监管者中断使能)和 sip(Supervisor Interrupt Pending,监管者中断待处理)CSR 是 S 模式的控制状态寄存器,他们是 mie 和 mip 的子集。它们有着和 M 模式下相同的布 局,但在 sie 和 sip 中只有与由 mideleg 委托的中断对应的位才能读写。那些没有被委派 的中断对应的位始终为零。
S 模式有几个异常处理 CSR:sepc、stvec、scause、sscratch、stval 和 sstatus,它 们执行与 10.2 中描述的 M 模式 CSR 相同的功能。
**补充说明**:为什么不无条件地将中 断委托给 S 模式? 一 个原因是虚拟化:如果 M 模式想要虚拟一个 S 模式的设备,其中断应 该转到 M 模式,而不是 S 模式。
## 基于页面的虚拟内存
RV64 支持多种分页方案,但我们只介绍最受欢迎的一种,Sv39。Sv39 使用和 Sv32 相 同的 4 KiB 大的基页。页表项的大小变成 8 个字节,所以它们可以容纳更大的物理地址。 为了保证页表大小和页面大小一致,树的基数相应地降到 2 9,树也变为三层。Sv39 的 512 GiB 地址空间划分为 2 9个 1 GiB 大小的基页。每个吉页被进一步划分为 2 9 个巨页。在 Sv39 中这些巨页大小为 2 MiB,比 Sv32 中略小。每个巨页再进一步分为 2 9个 4 KiB 大小 的基页。
一个叫 *<u>satp</u>*(Supervisor Address Translation and Protection,监管者地址转换和保护) 的 S 模式控制状态寄存器控制了分页系统。如图 10.12 所示,satp 有三个域。MODE 域可 以开启分页并选择页表级数,图 10.13 展示了它的编码。ASID(Address Space Identifier, 地址空间标识符)域是可选的,它可以用来降低上下文切换的开销。最后,PPN 字段保存 了根页表的物理地址,它以 4 KiB 的页面大小为单位。通常 M 模式的程序在第一次进入 S 模式之前会把零写入 satp 以禁用分页,然后 S 模式的程序在初始化页表以后会再次进行 satp 寄存器的写操作。
当在 satp 寄存器中启用了分页时,S 模式和 U 模式中的虚拟地址会以从根部遍历页表 的方式转换为物理地址。
如果所有取指,load 和 store 操作都导致多次页表访问,那么分页会大大地降低性能!所有现代的处理器都用地 址转换缓存(通常称为 TLB,全称为 Translation Lookaside Buffer)来减少这种开销。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册