What is PMP
我们知道,RISC-V提供了三种权限模式:
- M
- S
- U
其中,M(machine mode)可以访问全部的地址。为了禁止不可信的代码执行特权指令,引入了U(User mode)。为了限制不可信的代码使其只能访问自己的那部分内存,处理器可以提供一个物理内存保护(PMP,Physical Memory Protection)功能,以提供在各种模式下的内存保护。
PMP CSRs
RISC-V通过设置两类寄存器来实现PMP: *配置寄存器,8位 *地址寄存器,对于RV32是32位,对于RV64是64位,统一记作MXLEN位
一个配置寄存器和一个地址寄存器组成一个PMP入口(PMP entry)。配置寄存器和地址寄存器均属于CSR(Control and Status Register)。
地址寄存器通常为8-16个,8位的控制寄存器共16个。但显然,无论是对于RV32还是RV64,都不会存在一个只有8位(一个字节大小)的寄存器。故实际的实现上,是把几个控制寄存器组合到一个CSR中,如下图(图片来自官方手册):
对于RV32,将4个8bit配置寄存器放到一个32bit CSR寄存器中,对于RV64,每个真实寄存器中则保存了8个配置寄存器的信息。这些真实寄存器的名字即pmpcf0~pmpcf3
值得注意的是,对于RV64来说,pmp8cfg-pmp15cfg是保存在pmpcfg2中,而不是按顺序保存在pmpcfg1中。这样做是为了使得在RV32和RV64两种情况下,pmp8cfg~pmp11cfg均保存在pmpcfg2中,这样可以减少对于64位支持的开销。
在RISC-V设计的Sv32分页虚拟内存模式下,RV32拥有34位物理地址空间,故对于RV32来说,PMP必须支持34位的物理内存访问管理。故在32位地址寄存器中,保存33-2位的地址数据。而对于RV64,保存第55~2位,如下图:
也就是说,对于一个34位地址,若要保存到PMP地址寄存器中,需要将数据右移两位后存储。对于56位地址,将552位保存在PMP地址寄存器的530位。
下面来看配置寄存器:
其中,R、W、X分别对应读、写、执行权限,为1时有该权限,0时无权限。对于R=0 且 W=1的情况不符合实际含义,故作为保留,以便未来某些情况下使用。
当一条指令试图execute, load, store但遭到拒绝时,分别触发instruction access-fault exception, load access-fault exception, store access-fault exception。
Address Matching
之前说明了,一个PMP entry由一个地址寄存器和一个配置寄存器组成。那么,如何知道该PMP entry控制的物理地址范围呢?这是由配置寄存器中的A字段和地址寄存器共同决定的。
这部分主要解释配置寄存器中的A field的作用。A字段取值如下:
当A=0时,该PMP entry处于未启用状态,不匹配任何地址。
当A不等于零的时候,又分为三种情况,TOR, NA4, NAPOT(如上图中所示)。 其中NA4可以看作时NAPOT的一种特殊情况。所以我们先看一下NAPOT模式下一个PMP entry的地址寄存器所控制的地址范围是多少。
在上图中,当pmpcfg.A
为NAPOT时,从pmpaddr
的低位开始寻找连续1的个数。 *若pmpaddr
值为yyyy...yyy0
,即连续1的个数为0,则该PMP entry所控制的地址空间为从yyyy...yyy0
开始的8个字节 *若pmpaddr
值为yyyy...yy01
,即连续1的个数为1,则该PMP entry所控制的地址空间为从yyyy...yy00
开始的16个字节 *...... *若pmpaddr
值为y...y01...1
,设连续1的个数为n,则该PMP entry所控制的地址空间为从y...y00...0
开始的个字节
这种控制地址范围的方式叫做自然对其2指数地址范围(Naturally Aligned Power-of-2 regions, NAPOT)
考虑一种边界情况,若pmpaddr
值为yyyy...yyyy
,此时控制的地址范围即是从yyyy...yyyy
开始的4个字节,而pmpcfg.A
的值为NA4,即Naturally Aligned Four-byte regions.
另一种A字段的取值的TOR。当某个PMP entry 的配置寄存器的A字段设置位TOR时,该PMP entry所控制的地址范围由前一个PMP entry的地址寄存器(值为![image.png]]
)和该PMP entry的地址寄存器(值为 [图片上传失败...(image-3b6e55-1607322205111)]
)共同决定。其匹配任意满足如下条件的地址 [图片上传失败...(image-23032e-1607322205111)]
:
[图片上传失败...(image-b8236f-1607322205111)]
特别的,若第0个PMP entry的A字段为TOR,其所控制的地址空间的下界被认为是0,即匹配所有满足如下条件的地址 [图片上传失败...(image-fe495a-1607322205111)]
: [图片上传失败...(image-e22db9-1607322205111)]
Locking and Privilege Mode
这部分介绍配置寄存器中L field的作用。L字段表示PMP entry处于锁定状态,此时对于配置寄存器和对应的地址寄存器的写入会被忽略。被锁定的PMP entries在hart(hardware thread)重置之前都将保持锁定。
我们知道,通常情况下M模式拥有对于所有地址的所有权限。但当L字段为1时,M、S、U模式都必须遵循配置寄存器的权限设置(是否读、写、执行权限)。而当L字段为0时,在M模式下匹配到此PMP entry的任何操作都将成功,而S和U模式下需要遵循配置寄存器中的权限设置。
Priotity and Matching Logic
如果看明白上述内容,这部分就比较容易理解了。直接把手册上的原文复制过来了,有空再翻译。