ARM-MPU 详解
简介
MPU(Memory Protection Unit) 内存保护单元。 本文主要讲 armv7-m 架构 架构下的 MPU。在 armv7-m 架构下,Cortex-M3 和 Cortex-M4 处理器对 MPU 都是选配的,不是必须的。
MPU 是一个可以编程的 device 设备,可以用来定义内存空间的属性,比如特权指令和非特权指令以及 cache 是否可访问。armv7-m 通常支持 8 个 region。一个 region 就代表一段连续的区域。
MPU 可以让嵌入式系统更加健壮,以及保护一些加密区域,可以用来防止黑客攻击。
MPU 有以下能力可以增加系统的健壮性:
- 可以阻止用户去破坏操作系统需要使用的数据
- 可以防止一个任务去非法访问其他任务的数据,将任务完全隔离开
- 可以把关键数据区设为只读,从而不被破坏
- 检测其他意外访问,比如,堆栈溢出,数组越界等。
原理讲解
通常 MPU 功能这个是由操作系统提供的服务。在嵌入式调试的时候,我们经常会遇到 hardfault,这个时候一般情况可能是某个指针指到未知的地方,然后对该地址进行修改赋值,会触发 hardfault。MPU 的功能其实和这个功能基本类似。
首先理解以下两点,基本上可以大概理解 MPU:
- MPU 可以定义某些特定的地址区域的属性,这个属性可以定义成很多类型,比如定义成非特权状态下不可以赋值
- 如果非特权指针不小心访问到这个地址区域并且尝试给该区域赋值修改,这个时候会触发 MemManage fault 或者 hardfault 中断,代表你的程序不被允许修改该区域。
MPU 本质上就是为了保护某一段地址区域不被非授权状态的程序进行访问。
比如,RTOS中的一些特殊的变量,用户线程是不被允许访问和修改的,这个时候如果你启用了 MPU,并且保护了这些变量,那用户即使知道这里的实际的物理地址,也是不被允许访问和修改的。
MPU 寄存器模组
MPU 主要有以下寄存器
名称 | 地址偏移 |
---|---|
MPU 类型寄存器 TYPER | 0xE000ED90 |
MPU 控制寄存器 CTRL | 0xE000ED94 |
MPU region 号寄存器 RNR | 0xE000ED98 |
MPU region 基地址寄存 |