PMP 配置
PMP 寄存器只能在机器模式下编程。pmpaddrX 寄存器应首先用受保护区域的基地址编程,右移两位。然后,应该使用正确配置的 64 位值对pmpcfgY 寄存器进行编程,其中包含每个正确对齐的 8 位 pmpXcfg 字段。未使用的字段可以简单地写入 0,标记它们未使用。
PMP 配置例子
以下示例显示了仅机器模式的配置,其中 PMP 权限应用于三个感兴趣的区域,第四个区域覆盖剩余的内存映射。回想一下,较低编号的 pmpXcfg 和pmpaddrX 寄存器优先于较高编号的区域。该规则允许更高编号的 PMP寄存器全面覆盖整个内存映射,同时允许编号较低的区域将权限应用于特定的感兴趣区域。以下示例显示基地址 0x0 处的 64 KB 闪存区域、基地址0x2000_0000 处的 32 KB RAM 区域以及基地址 base 0x3000_0000 处的 4 KB外设区域。内存映射的其余部分是保留空间。
PMP 访问场景
L、R、W 和 X 位仅在访问的所有字节都被该 PMP 条目覆盖时确定访问是否成功。例如,如果 PMP 条目配置为匹配四字节范围0xC–0xF,那么对 0x8–0xF 范围的 8 字节访问将失败,假设 PMP 条目是与这些地址匹配的最高优先级条目。
在锁定位清零 (L=0) 的机器模式下运行时,如果 PMP 条目与访问的所有字节匹配,则访问成功。如果在机器模式下设置了锁定位(L=1),则访问取决于为该区域设置的权限。同样,在管理员模式或用户模式下,访问权限取决于为该区域设置的权限。
失败的读取或写入访问会生成加载或存储访问异常,并且指令访问错误会在失败的指令获取时发生。当尝试从没有执行权限的区域执行时发生异常时,错误发生在获取而不是分支上,因此mepc CSR 将反映目标保护区的值,而不是分支的地址。
一条指令可能产生多个访问,这可能不是相互原子的。如果一条指令产生的至少一次访问失败,则将发生异常。一条指令的其他访问可能会成功,但会产生明显的副作用。例如,对虚拟内存的引用可以分解为多个访问。
在某些实现中,未对齐的加载、存储和指令提取也可能被分解为多个访问,其中一些可能在访问异常发生之前成功。特别是,通过 PMP检查的未对齐存储的一部分可能变得可见,即使另一部分未通过 PMP 检查。对于比 XLEN 位宽的浮点存储(例如,RV32D 中的 FSD指令),即使存储地址自然对齐。
-
内核
+关注
关注
3文章
1372浏览量
40290 -
PMP
+关注
关注
0文章
45浏览量
18166 -
RISC
+关注
关注
6文章
462浏览量
83734 -
配置
+关注
关注
1文章
188浏览量
18382 -
sifive
+关注
关注
0文章
36浏览量
9460
发布评论请先 登录
相关推荐
评论