5.3 PMP与内存保护:最后的守门人


5.3 物理内存保护:最后的守门人

本节摘要:虚拟内存保护的是"进程之间的墙",物理内存保护守的是"机器模式之下的门"——它在物理地址上布一张门禁表,规定低特权模式能碰哪些地址段、以什么权限碰,而且机器模式自己也能被这张表锁在门外。本节讲清保护条目的匹配模式与权限语义、锁定位的不可逆设计,以及安全启动与可信执行环境中的两类标准用法。

为什么虚拟内存之外还需要一道门

先问一个问题:监督模式的内核配置好页表、把用户程序关进虚拟地址的笼子之后,机器模式的固件还能被谁伤害?答案令人不安——页表是监督模式自己写的,监督模式被攻破时页表形同虚设。而真实系统里,机器模式固件、引导加载器、硬件初始化代码都运行在高权限,一旦某个低权限组件(甚至被攻破的内核)能随意触碰机器模式的数据与代码,整个信任链条就从根部断裂。

物理内存保护就是补这道门的机制:一组由机器模式配置的条目,直接对物理地址做访问检查,检查在取指与访存路径上强制执行,任何软件都无法绕过——包括配置它自己的机器模式(当锁定位生效后)。它与虚拟内存是两道独立的墙:虚拟墙按地址翻译后的视图管"进程视角",物理墙按真实地址管"硬件视角";前者可被更高权限动态改写,后者一旦上锁连最高权限都退不出来。

门禁表怎么写:条目、匹配与权限

保护条目每条记三样东西:一个地址区间、一组权限位(读、写、执行)、一个锁定位。区间有三种匹配模式,粒度与灵活性各有取舍:

顶级对齐模式:条目的上边界必须与上一条目的下边界对齐,区间大小隐含在地址里。配置简单,适合一格格连续划分地址空间。自然对齐四字节模式:直接指定一个四字节粒度的精确地址。自然对齐幂次模式:一条条目用编码同时表达基址与大小(二的幂次对齐的区间,例如从某个对齐地址开始的一段两的幂次方字节区间),最省条目——把一整段外设空间用一条规则圈起来就靠它。

检查流程顺着条目序号走:取指或访存地址落在哪条条目的区间里,就按那条的权限判定;高编号条目优先;都没命中则默认拒绝。默认拒绝是安全设计的金标准——没写进白名单的一律不许进,而不是反过来。

一次访问的判定流程

一次访问的判定流程

锁定位:不可逆的保险栓

条目里最有意思的一位是锁定位:置位后,这条条目在下次硬复位前不可修改,且机器模式自己也受它约束。这一位是整个信任模型的支点——引导固件在启动早期把关键内存段(自己的代码、密钥存储、引导配置)锁成只读或完全禁写,然后"把钥匙扔掉";此后无论哪个权限层想改写这段内存,硬件层面直接拒绝。攻击者即使拿到了机器模式执行权,也无法改写已上锁的引导代码——除非能物理复位并重新走一遍启动链。

对比软件防护:任何纯软件的检查都能被更高权限的软件绕过,而锁定位后的检查是电路级的——它不需要运行中的软件配合,因此不依赖软件的完整性。这是"用硬件不变性换信任锚点"的典范设计。

两类标准用法

用法一:安全启动链。 固件启动时依次配置门禁:把引导代码段锁为不可写、把密钥区锁为不可读写(只有专门的密码引擎能碰)、把调试通道按配置收紧,最后锁定全部条目再移交控制权。每一级引导都重复"配置—锁定—移交"的仪式,信任从复位向量逐级传递到操作系统。

用法二:可信执行环境的围栏。 在通用系统里圈出一块"飞地"内存:平时对普通世界完全不可见(未命中条目、默认拒绝),进入可信会话时由机器模式固件临时调整条目放行。由于检查基于物理地址,虚拟机、缓存侧信道的部分攻击面也被物理墙挡住。轻量级方案里,这块围栏加上锁定位,就能支撑起指纹比对、密钥操作这类敏感任务,不需要完整的可信执行环境指令集扩展。

⚠️ 常见坑:把门禁表当性能无关的配置随手写。条目数过多或匹配模式选得松散,比较器深度会顶住访存关键路径;工程做法是"少量条目加幂次模式圈大段、精确条目只给关键小段",用最少的条目表达最紧的策略。

两道墙的协作布防

物理保护与虚拟保护不是二选一,成熟系统的布防是两层叠加:虚拟墙按进程画格子——每个进程一个地址空间,互相看不见;物理墙按信任级别画禁区——关键区域连"能配置格子的人"都碰不到。一次典型的纵深防御:固件启动时用物理保护锁死引导代码与密钥区(第一道),内核再为每个进程建立虚拟隔离(第二道),进程内的缓冲区溢出只能损害本进程,内核被攻破也改不了引导区。两道墙的检查点位置也不同——虚拟检查在地址翻译时(4.1),物理检查在访存路径上,各自独立生效,绕过其一还有其二。

常见问题快答

问:物理保护条目数量有限,怎么覆盖复杂布局? 靠组合:大段区域用幂次模式一条圈住(整段外设、整个固件区),零散关键小段用精确条目,其余交给"默认拒绝"。条目是稀缺资源,规划时先画地址图、再数条目,别写代码时随手加。

问:机器模式被锁在门外,那固件自己要访问受保护区怎么办? 设计时给自己留活口:受保护区域按"锁写不锁读"或"仅锁定关键段"配置,固件需要的只读访问不受影响;确需写入的维护操作,走"下次复位前重配"的约定或专门的密码引擎通道。锁的是"运行期的暗改",不是"一切访问"。

配置工作的实操节奏:写门禁表的推荐顺序是先画地址图再写条目——把内存布局按"固件区、密钥区、外设区、共享区、自由区"分色标出,每区标注目标权限,然后从高编号条目往低编号配(高编号优先的规则要在排表时就用起来:例外的小段放高编号,兜底的大段放低编号),最后整体锁定前自查一遍"默认拒绝是否真的兜住了未列出区域"。这一套画图、排序、锁定、自查的节奏,比直接闷头写条目少走九成弯路。

本节要点回顾

  • 两道墙分工:虚拟内存管进程视角、可被高权限改写;物理保护管硬件视角、锁定后不可绕过;
  • 门禁表三要素:区间(三种匹配模式)、权限位、锁定位;高编号优先、默认拒绝;
  • 锁定位是信任支点:电路级不可逆,机器模式自己也受约束;
  • 两类用法:安全启动链的逐级锁定移交、可信执行环境的物理围栏;
  • 门禁也有时序账单:条目数与粒度并联在访存路径上,少而精是工程答案。

特权架构三件套齐了。下一章回到第二章的账单,看两个最贵的扩展——向量与安全实时特性——在硬件里如何落地。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U