MPU 内存保护单元

← 返回 Cortex-M4内核原理 | ← 主页

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离线断点 Demo


MPU vs MMU

维度MPUMMU
全称MemoryProtection UnitMemoryManagement Unit
核心功能访问权限检查虚拟地址 → 物理地址翻译
地址是否变化不变(直接用物理地址)变(逻辑→物理)
页表 / TLB无有
虚拟内存不支持支持
典型场景MCU(Cortex-M)+ RTOS/裸机应用处理器(Cortex-A)+ Linux
复杂度简单(≤8 个 region)复杂(多级页表)