区域隔离:将物理内存划分为最多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流水线刷新,实时性受影响
无加密保护:仅提供访问控制,不防御物理总线嗅探攻击