RISC-V物理内存保护(Physical Memory Protection, PMP)是M模式特权级下的硬件安全模块,PMP 机制适用于所有特权模式为 S 或 U 的指令和数据访问,通过在 M 态下修改每个 hart 对应的控制寄存器,可以指定每个物理内存区域的读、写和执行等访问权限。此外,PMP 机制也可用于 S 态中的页表访问。违反 PMP 机制的访存将被处理器捕获并触发异常。主要解决嵌入式场景中的内存隔离与权限控制问题。与ARM TrustZone的全局安全域划分不同,PMP采用精细化区域保护策略,通过配置寄存器组实现以下核心功能:
- 区域隔离:将物理内存划分为最多16个独立区域(不同实现可能扩展)
- 权限控制:为每个区域设置读/写/执行(R/W/X)权限组合
- 特权级约束:限制U/S/M模式对指定区域的访问权限
典型应用场景包括:实时操作系统内核保护、物联网设备固件隔离、多任务环境内存沙箱等。
PMP硬件实现机制
在《RISC-V 特权指令集手册》的第 3.7 节中介绍了内存保护机制。每一个 PMP 项定义了一个访问控制区域。一个 PMP 项包括一个 8 位控制寄存器和一个地址寄存器,仅可在 M 态下访问,处理器支持最多 64 个 PMP 项。PMP 访问控制区域的大小是可设置的,最小可支持 4 字节大小的区域。
- 寄存器架构
PMP通过两组CSR寄存器协同工作:
- pmpcfgX(配置寄存器):8位字段定义区域权限(R/W/X)和匹配模式
- pmpaddrX(地址寄存器):设置区域边界(支持NAPOT/TOR等编码模式)
- 地址匹配模式
模式编码特点TOR00通过pmpaddr[N-1]:pmpaddr[N]确定区域范围(适合非连续区域)NAPOT11利用地址寄存器低比特位表示区域大小(如0x1000-0x1FFF编码为0x1001)NA401固定4字节对齐区域(极简场景适用)
- 权限检查流程
当CPU发起内存访问时,硬件按以下顺序验证:[遍历所有PMP条目(序号从小到大)] => [若地址匹配某条目且权限满足 → 放行] => [若所有条目均不匹配 → 根据mstatus.MPRV决定是否拒绝访问]
- 优先级机制
PMP 条目间采用静态优先级,当区间重叠时,编号小的条目优先级更高。匹配到访问中任何字节的最低编号的 PMP 条目决定本次访问是成功还是失败。
- 原子性
匹配的 PMP 条目必须包含访问的所有字节,否则无论 L、R、W 和 X 位的值是什么,访问都将失败。例如,如果一个 PMP 条目被配置为匹配 4 字节区域 0xC–0xF,且为最高优先级条目,那么对区域 0x8–0xF 的 8 字节访问将失败。
PMP典型应用
RTOS内存保护:在FreeRTOS等系统中,通过PMP隔离内核数据与用户任务空间,防止任务越界访问
安全启动链:在Bootloader阶段锁定固件存储区(如Flash)为只读,防止恶意篡改
PMP局限性
- 区域数量瓶颈:标准PMP仅支持8-16个区域,难以满足复杂系统需求
- 动态调整延迟:修改PMP配置需触发CPU流水线刷新,实时性受影响
- 无加密保护:仅提供访问控制,不防御物理总线嗅探攻击
|