RISC-V PMA、PMP机制深入分析
1 PMA
PMA(Physical Memory Attributes),物理内存属性,顾名思义就是用来设置物理内存属性的,但这里说“设置”,并不合理,因为一般情况下各存储的属性,在芯片设计时就固定了,不可动态修改。
1.1 属性定义
PMA定义了物理内存区域的以下静态属性:
-
缓存行为(Cacheable/Non-Cacheable):决定数据是否可被缓存。
-
原子操作支持(Atomics):是否允许使用LR/SC指令进行原子操作。
-
可执行权限(Execute Permission):是否允许执行指令。
例如,外设寄存器通常配置为Non-Cacheable且禁止执行,避免缓存干扰硬件交互;主内存(如RAM)则多设为Cacheable以提升性能。
另外,一般PMA属性在芯片设计时固化,无法通过软件动态修改,需通过硬件逻辑直接实现。这种设计保证了关键内存区域(如外设)行为的确定性,避免运行时误操作。
1.2 SiFive U74 PMA
下图是SiFive U74的内存映射和PMA
前面说PMA一般情况下不可修改,实际上芯来科技的设计内核架构提供了一组mattri[i]_base
、mattri[i]_mask
('i’指编号),可以让软件来修改PMA,但这里也有规则,有优先级顺序,即只能从低优先级修改成高优先级属性(感兴趣可以自行查找芯来RISC-V ISA spec)
2 PMP
2.1 简介
PMP(Physical Memory Protection)物理内存保护。
RISC-V特权模式及切换 , 有介绍过RISC-V的特权模式,如何限制各特权的访问权限呢,实现安全隔离呢?这里就需要PMP来提供了。
PMP可以提供安全处理和故障隔离功能,对现代处理器来说是非常重要的。PMP 机制适用于所有特权模式为 S 或 U 的指令和数据访问,通过在 M 态下修改每个 hart 对应的控制寄存器,可以指定每个物理内存区域的读、写和执行等访问权限。此外,PMP 机制也可用于 S 态中的页表访问。违反 PMP 机制的访存将被处理器捕获并触发异常
-
核心功能:
- 负责隔离S/U模式下的内存访问,可通过RISC-V可信固件在M-mode下动态配置S/U模式下程序的读、写和执行权限。
- 用于保护安全外设IO,可以通过约束控制设备控制器MMIO地址空间的访问权限来实现。
- 对于安全域共同访问的共享内存,可以通过将该共享内存分配给不同安全域来实现。
- 当HART进行安全域切换时,RISC-V可信固件通过PMP为目标安全域分配可访问的系统资源,这可以通过在M-mode下操作PMP配置表和地址表进行管理。
-
物理内存保护机制:
- 通过配置寄存器pmpcfg和地址寄存器pmpaddr,来定义内存区域访问权限
- 一个配置寄存器和一个地址寄存器组成一个PMP表项(entry),每一个entry对应一段物理地址的范围和权限(R/W/X),一般硬件对表项数量有要求,通常为8或者16,最大64
2.2 配置规则
- pmpcfg寄存器
pmpcfg<x>
寄存器用于指定 PMP 表项的权限配置寄存器,每个pmpcfg<x>
寄存器可以管理四个PMP 表项目
每个表项的权限配置寄存器 pmp<x>cfg
中各控制位域:
域 | 位 | 描述 |
---|---|---|
R | 0 | 控制数据可读权限: - 1:地址区间可读 - 0:地址区间不可读 |
W | 1 | 控制数据可写权限: - 1:地址区间可写 - 0:地址区间不可写 |
X | 2 | 控制代码可执行权限: - 1:地址区间可执行 - 0:地址区间不可执行 |
A | 4:3 | 控制地址区间模式(详见下表) |
Reserved | 6:5 | 未使用域(固定为0) |
L | 7 | 控制PMP表项锁定: - 1:锁定表项 - 0:不锁定表项 |
每个表项的权限配置寄存器 pmp<x>cfg
中的“A”比特域(第 4~3 位)用于控制该表项的地
址区间模式,其编码和模式的含义:
A | 名称 | 描述 |
---|---|---|
0 | OFF | 空模式,即:没有配置此表项 |
1 | TOR | 紧邻下一边界 即区域 X 的结束地址紧邻下一区域的基地址寄存器 pmpaddrX 的值 举例:pmpcfg0设置为TOR,则受保护为[pmpaddr0,pmpaddr1] |
2 | NA4 | 4 个字节大小的区域(地址对齐) |
3 | NAPOT | 2 的幂次方大小的区域(区域大小起码大于等于 8 个字节,并且地址对齐) |
其中:
-
NA4:Naturally Aligned 4-byte
-
NAPOT:Naturally Aligned Power-of-Two
-
L域中L=1表示PMP entry会被锁定,意味着此时写PMP寄存器和地址寄存器会被忽略。
- pmpaddr
保护地址至少四字节对齐,所以在RV32的cfgaddr里写保护地址的[33:2]
保护机制如下:
- 1、pmpcfg.A=2(NA4模式)
定义保护一个4字节对齐的连续地址,若此时pmpaddr0 = 0x20000
,则保护0x20000-0x20003
。一般用来包含单个寄存器或者单字数据。
- 2、pmpcfg.A=3(NAPOT模式)
定义保护一个2的幂次方对齐的连续区域,具体由pmpaddr0的低位连续1的个数决定。
如下图所示:
将pmpaddr的值转换成二进制,从低位开始统计连续1的数量(计为n
)。则保护区域大小为2^(n+3)
字节。
示例:pmpaddr的值为yyyy…y01111,则保护区域大小为:2^(4+3) = 128byte
。假如此时pmpaddr0 = 0x2000F
,
则保护0x20000-0x2007F
。
优先级及原子性说明:
-
1、优先级机制
PMP 条目间采用静态优先级,当区间重叠时,编号小的条目优先级更高。匹配到访问中任何字节的最低编号的 PMP 条目决定本次访问是成功还是失败。 -
2、原子性
匹配的 PMP 条目必须包含访问的所有字节,否则无论 L、R、W 和 X 位的值是什么,访问都将失败。例如,如果一个 PMP 条目被配置为匹配 4 字节区域 0xC–0xF,且为最高优先级条目,那么对区域 0x8–0xF 的 8 字节访问将失败。
RV64说明:
另外上面的配置是针对RV32,对于RV64,每个pmpcfg<x>
寄存器,包含8个entry
,所以只需要 8 个 CSR 寄存器即可实现与RV32的相同功能。为了与 RV32 保持一致,并降低软件支持成本,RV64 中的 CSR 寄存器编号均为偶数,即 pmpcfg0,pmpcfg2,...,pmpcfg14
,奇数编号的寄存器是非法的
pmpaddr
,bit[63:54]
固定为0,bit[53:0]
用于存储地址信息,保护机制同RV32,类比即可,不再举例说明。
NOTE:
- WARL(Write Any Read Legal)
2.3 配置code
OpenSBI(opensbi/lib/sbi/sbi_hart.c)
int sbi_hart_pmp_configure(struct sbi_scratch *scratch)
{int rc;unsigned int pmp_bits, pmp_log2gran;// 获取当前硬件线程(hart)支持的PMP区域数量unsigned int pmp_count = sbi_hart_pmp_count(scratch);unsigned long pmp_addr_max;// 如果硬件不支持PMP,则直接返回0(无需配置)if (!pmp_count)return 0;// 获取PMP的粒度(对齐单位),以2的对数值表示(如4表示16字节对齐)pmp_log2gran = sbi_hart_pmp_log2gran(scratch);// 计算PMP地址寄存器的有效位数(规范定义为实际位数减1)pmp_bits = sbi_hart_pmp_addrbits(scratch) - 1;// 计算PMP支持的最大物理地址:(2^(pmp_bits+1) - 1pmp_addr_max = (1UL << pmp_bits) | ((1UL << pmp_bits) - 1);// 根据是否支持SMEPMP扩展选择不同的配置函数if (sbi_hart_has_extension(scratch, SBI_HART_EXT_SMEPMP))// 使用增强型PMP(SMEPMP)配置rc = sbi_hart_smepmp_configure(scratch, pmp_count,pmp_log2gran, pmp_addr_max);else// 使用传统PMP配置rc = sbi_hart_oldpmp_configure(scratch, pmp_count,pmp_log2gran, pmp_addr_max);/** 特权规范v1.12第3.7.节要求:* 1. 内存访问可能被预取执行,地址翻译可能被缓存* 2. CPU热插拔/非保持性挂起会丢失PMP状态* 3. 需要刷新缓存以保证PMP配置立即生效*/// 检查是否支持监管模式(S-mode)if (misa_extension('S')) {// 刷新当前硬件线程的TLB和地址翻译缓存__asm__ __volatile__("sfence.vma");// 如果支持Hypervisor扩展(H-mode)if (misa_extension('H'))// 额外刷新所有Guest模式的地址翻译缓存__sbi_hfence_gvma_all();}// 返回PMP配置结果(0=成功,非0=错误)return rc;
}
此函数是 RISC-V 安全引导流程(如 OpenSBI)的核心部分,负责:
- 初始化物理内存保护(PMP)机制。
- 根据硬件特性选择传统或增强型配置。
- 确保 PMP 生效后内存访问的安全性。
3 PMA与PMP的协同规则
在RISC-V架构中,PMA(物理内存属性)和PMP(物理内存保护)是两种不同的机制,它们共同作用于物理内存访问的控制。PMA定义了内存区域的固有属性(如是否可缓存、是否可执行等),而PMP则提供了基于特权模式的访问控制(如用户模式是否可以读写某区域)。二者通过静态属性与动态权限叠加进行内存访问保护,下面简单介绍下协同工作的规则
3.1 协同规则
- PMP的权限约束需基于PMA的属性定义
PMP(物理内存保护)的访问控制规则仅在 PMA(物理内存属性)允许的权限范围内有效。例如,若 PMA 将某内存区域标记为 不可执行(Non-Executable),即使 PMP 配置为允许执行(Execute),对该区域的执行访问仍会触发异常。这是因为 PMA 是更底层的硬件保护机制,决定了内存的物理属性(如可执行性、缓存策略),而 PMP 只能在此基础上叠加权限限制。
- 外设寄存器的联合保护机制
对于设备内存(如外设寄存器),PMA 通过设置 不可缓存(Non-Cacheable)属性确保直接访问硬件寄存器,而 PMP 则进一步通过权限配置(如仅允许 M-mode 读写)防止用户程序(U-mode/S-mode)误操作硬件。这种 PMA 属性定义与 PMP 权限控制的协同设计,既能保障硬件访问的可靠性,又能防止越权访问引发的安全风险。
3.2 典型协同流程
上图简单总结了下,PMA与PMP的协同工作时的流程,内存访问时,
- 1、进行地址转换(虚拟地址到物理地址)
- 2、执行PMA检查(验证物理内存固有属性,如可执行性/可写性)
- 3、若失败则立即触发异常;
- 4、通过PMA后进入PMP检查(验证基于特权模式的软件权限,如读/写/执行控制),若失败同样触发异常;
- 5、只有同时通过PMA和PMP双重检查,才允许执行最终的内存访问。
这种分层机制确保了硬件属性与软件权限的协同验证,为系统提供基础安全隔离和可靠性保障。
所以我们在在配置时,需确保PMP规则与PMA属性一致,以避免意外行为。
3.3 ePMP(Enhanced Physical Memory Protection)
ePMP 是 RISC-V 架构中 PMP 的增强版本,通过 Smepmp 扩展实现。它在传统 PMP 基础上增加了关键安全特性,特别针对机器模式(M-mode)提供了更严格的内存保护机制。
关于ePMP后续再做具体补充说明,感兴趣可以阅读RISC-V来学习。
参考:
SiFive U74 手册
The RISC-V Instruction Set Manual (Volume II: Privileged Architecture)
相关文章:

RISC-V PMA、PMP机制深入分析
1 PMA PMA(Physical Memory Attributes),物理内存属性,顾名思义就是用来设置物理内存属性的,但这里说“设置”,并不合理,因为一般情况下各存储的属性,在芯片设计时就固定了…...
git常见命令说明
git branch -avv -a 显示 所有分支-vv (--verbose 的缩写) 额外显示本地分支跟踪的远程分支(如 [origin/main])及其状态对比。 # git branch -v * main abc1234 修复登录bugdev def5678 更新文档# git branch -vv * main abc1234 …...
深入解析 Tomcat 线程管理机制:从设计思想到性能调优
一、Tomcat 线程模型的核心架构 Tomcat 的线程管理机制是其高性能的核心支撑,其设计围绕 Connector(连接器) 和 Executor(执行器) 两大组件展开。以下为架构分层解析: 1. Connector 的线程模型 Tomcat 的…...

【NebulaGraph】查询案例(七)
【NebulaGraph】查询案例 七 1. 查询语句12. 查询语句23. 查询语句34. 查询语句4 1. 查询语句1 GO FROM "player100" OVER * YIELD type(edge) AS link, properties($$) AS properties,tostring(src(edge)) AS src,tostring(dst(edge)) AS dst, tags($$) AS tagLi…...

从“刚性扩容”到“弹性供给”:移动充电服务重构配电网边际成本
随着新能源技术的快速发展,电动汽车的普及对传统配电网提出了新的挑战。传统的“刚性扩容”模式依赖基础设施的物理扩建,不仅投资成本高,且难以应对动态变化的电力需求。在此背景下,“弹性供给”理念逐渐兴起,特别是移…...
Java与Docker容器化优化:从核心技术到生产实践
在2025年的云原生与微服务时代,容器化技术已成为企业级应用部署的标准,Docker作为主流容器平台,显著提升了应用的 portability、可扩展性和部署效率。根据CNCF 2024年报告,95%的企业在其生产环境中使用Docker,特别是金…...
QT单例模式简单讲解与实现
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。在QT开发中,单例模式常用于管理全局资源,如配置管理、日志系统等。 最简单的QT单例实现 方法一:静态局部变量实现(C11及以上…...
Vite Vue3 配置 Composition API 自动导入与项目插件拆分
为了提升开发效率,减少重复引入 ref、reactive、computed 等 Composition API 的繁琐操作,通过 unplugin-auto-import 插件实现自动导入。 1、配置自动导入 1.1 安装插件 npm install -D unplugin-auto-import1.2 配置 vite.config.js import { def…...
React从基础入门到高级实战:React 生态与工具 - React Query:异步状态管理
React Query:异步状态管理 引言 在现代Web开发中,异步数据管理是React应用开发中的核心挑战之一。无论是从远程API获取数据、处理用户交互,还是同步服务器状态,开发者都需要一种高效、可靠的方式来应对这些复杂场景。传统的状态…...

Grafana-Gauge仪表盘
仪表盘是一种单值可视化。 可让您快速直观地查看某个值落在定义的或计算出的最小和最大范围内的位置。 通过重复选项,您可以显示多个仪表盘,每个对应不同的序列、列或行。 支持的数据格式 单值 数据集中只有一个值,会生成一个显示数值的…...
按照状态实现自定义排序的方法
方法一:使用 MyBatis-Plus 的 QueryWrapper 自定义排序 在查询时动态构建排序规则,通过 CASE WHEN 语句实现优先级排序: import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.stereotype.Ser…...

游戏引擎学习第313天:回到 Z 层级的工作
回顾并为今天的内容定下基调 昨天我们新增了每个元素级别的排序功能,并且采用了一种我们认为挺有意思的方法。原本计划采用一个更复杂的实现方式,但在中途实现的过程中,突然意识到其实有个更简单的做法,于是我们就改用了这个简单…...
论文阅读:arxiv 2024 SmoothLLM: Defending LLMs Against Jailbreaking Attacks
SmoothLLM: Defending LLMs Against Jailbreaking Attacks 总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 https://www.doubao.com/chat/6961264964140546 https://github.com/arobey1/smooth-llm https://arxiv.org/pd…...

Milvus部署架构选择和Docker部署实战指南
导读:向量数据库作为AI时代的核心基础设施,Milvus凭借其强大的性能和灵活的架构设计在市场中占据重要地位。然而,许多开发者在部署Milvus时面临架构选择困惑和配置复杂性挑战,导致项目进展受阻。 本文将为您提供一套完整的Milvus部…...

高效合并 Excel 表格实用工具
软件介绍 这里介绍一款用于 Excel 合并的软件。 使用反馈与工具引入 之前推荐过 Excel 合并工具,但有小伙伴反馈这些工具对于需要合并单元格的 Excel 文件不太适用,而且无法合并表头。鉴于这些问题,找到了今天要介绍的这款 Excel 合并工具…...
【前端】Vue3 中实现两个组件的动态切换保活
在 Vue3 中实现两个组件的动态切换保活,核心是通过 <component> 动态组件与 <KeepAlive> 缓存组件的组合使用。以下是具体实现方案和进阶技巧: 一、基础实现方案 1. 动态组件 KeepAlive 保活 使用 <component :is> 实现动态切换&am…...

拉取gitlab项目
一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接:开始 下载nvm - nvm中文官网 情况:npm i 下载依赖缓慢,可能是node版本不对,可能node版本太高 可能得问题:使用nvm 下载低版本的node时,…...

树莓派(Raspberry Pi)安装Docker教程
本章教程,主要介绍如何在树莓派上安装Docker。 一、安装步骤 # 卸载旧版本(如果有): for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg;...

计算机视觉---YOLOv4
YOLOv4(You Only Look Once v4)于2020年由Alexey Bochkovskiy等人提出,是YOLO系列的重要里程碑。它在YOLOv3的基础上整合了当时最先进的计算机视觉技术,实现了检测速度与精度的显著提升。以下从主干网络、颈部网络、头部检测、训练…...

在雄性小鼠自发脑网络中定位记忆巩固的因果中枢
目录 简要总结 摘要 1 引言 2 方法 3 结果 简要总结 这篇文章主要研究了雄性小鼠在自发脑网络中记忆巩固的因果中枢定位。记忆巩固涉及学习后休息和睡眠期间全脑网络的自发重组,但具体机制尚不清楚。目前理论认为海马体在这一过程中至关重要,但其他…...

刷机维修进阶教程-----没有开启usb调试 如何在锁定机型的拨号界面特殊手段来开启ADB
有时候我们会遇到一些机型被屏幕锁 账号锁等锁定。无法进入系统界面。也没有开启usb调试的情况下如何通过一些操作来开启adb调试。然后通过adb指令来禁用对应的app顺利进入系统。以此来操作保数据等操作. 通过博文了解💝💝💝 1💝💝💝----了解一些品牌机型锁定状态…...

Selenium 测试框架 - Kotlin
🚀Selenium Kotlin 实践指南:以百度搜索为例的完整测试示例 随着测试自动化的普及,Selenium 已成为 Web 自动化测试的事实标准,而 Kotlin 凭借其简洁语法和高安全性,越来越受到开发者欢迎。本指南将通过一个完整的实战案例——在百度中执行搜索操作,来展示如何使用 Sele…...
docker运行centos提示Operation not permitted
在使用Docker运行CentOS容器时,遇到"Operation not permitted"错误,通常是由于权限问题或容器安全策略引起的。以下是详细的排查和解决步骤: 步骤一:检查Docker版本和系统更新 首先,确保你的Docker和系统软…...

010501上传下载_反弹shell-渗透命令-基础入门-网络安全
文章目录 1 上传下载2 反弹shell命令1. 正向连接(Forward Connection)正向连接示例(nc) 2. 反向连接(Reverse Connection)反向连接示例(反弹 Shell) 对比表格实际应用中的选择防御建…...

Flask集成Selenium实现网页截图
先看效果 程序实现的功能为:截取目标网址对应的页面,并将截取后的页面图片返回到用户端,用户可自由保存该截图。 支持的url参数如下: url:目标网址(必填项),字符串类型,…...
机顶盒CM311-5s纯手机免拆刷机,全网通,当贝桌面
需要用到的工具 安卓手机一台 甲壳虫adb助手(安卓app) OTG转换线一个(或者用usb,typec双头的U盘一个,未测试) 8g U盘一个 用到的刷机文件 1.放入手机中的文件 misc recovery 2. 放入U盘根目录 upda…...

知识图谱:AI时代语义认知的底层重构逻辑
在生成式人工智能(GEO)的技术架构中,知识图谱已从辅助性工具演变为驱动机器认知的核心神经中枢。它通过结构化语义网络的重构,正在突破传统数据处理的线性逻辑,建立机器对复杂业务场景的深度理解能力。 一、语义解构&a…...
centos7安装MySQL(保姆级教学)
在 Linux 系统的软件管理中,YUM(Yellowdog Updater, Modified)包管理器是不可或缺的工具,而 YUM 源的选择与配置直接影响着软件安装与更新的效率。本文将深入解析网络 YUM 源的分类,详细介绍如何使用知名平台提供的 YU…...
2025.5.23 【ZR NOI模拟赛 T3】高速公路 题解(容斥,高维前缀和,性质)
非常牛的题,记录一下思路。 传送门 题意 有一张 n n n 个点的无向图,每个点有一个颜色 c i c_i ci,满足 c i ∈ [ 1 , k ] c_i \in [1, k] ci∈[1,k]。 图是由 m m m 条链组成,满足任意一个点恰好只在一条链上。对于一…...

QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)
QGIS新手教程:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出) 目录 QGIS新手教程:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)📌 引言第一部分࿱…...