MPU 内存保护单元
Cortex-M 内核外设,只管「谁能不能访问哪块内存」,不做地址翻译。
MPU离线断点就是使用MPU做的
作用
| 需求 | MPU 怎么解决 |
|---|---|
| 任务 A 破坏 OS 内核 / 其他任务内存 | 给每个任务划分独立 region,越界访问触发MemManage 异常(HardFault) |
| 防止误写只读配置(向量表、外设寄存器) | 给该区域设只读/禁写权限 |
| 防代码注入攻击 | XN(Execute Never)禁止某块内存执行 |
| 栈溢出保护 | 在栈底下方留一块不可访问的 guard region |
| 定位谁改写了某个变量 | 监视地址设为 NO_ACCESS,一被访问立刻进 MemManage 异常 →MPU离线断点 |
本质:在 CPU 与总线之间插一道「门禁」,每次访存拿地址比对 region 表——命中则按该 region 权限放行/拦截,未命中按默认背景属性处理。
硬件特性(Cortex-M4)
| 项 | 规则 |
|---|---|
| region 数量 | 最多 8 个(0~7) |
| region 大小 | 2 的幂(32B ~ 4GB) |
| 起始地址 | 必须对齐到自身大小(如 32KB 区域必须 32KB 对齐) |
| 重叠优先级 | 编号越大优先级越高(7 最高),重叠处高编号属性生效 |
| 背景 region | 未被任何 region 覆盖的地址:使能 PRIVDEFENA 则按默认特权属性,否则禁止访问 |
配置
MPU vs MMU
| 维度 | MPU | MMU |
|---|---|---|
| 全称 | MemoryProtection Unit | MemoryManagement Unit |
| 核心功能 | 访问权限检查 | 虚拟地址 → 物理地址翻译 |
| 地址是否变化 | 不变(直接用物理地址) | 变(逻辑→物理) |
| 页表 / TLB | 无 | 有 |
| 虚拟内存 | 不支持 | 支持 |
| 典型场景 | MCU(Cortex-M)+ RTOS/裸机 | 应用处理器(Cortex-A)+ Linux |
| 复杂度 | 简单(≤8 个 region) | 复杂(多级页表) |