ARM架构 Cortex-M3 Cortex-M4 MPU

2022-07-02

什么是MPU

MPU(memory protection unit),内存保护单元,是一种可编程部件,用于定义不同存储器区域的存储器访问权限和存储器属性。

MPU的作用

MPU可以提高嵌入式系统的健壮性,使系统更安全

  1. 可以避免应用任务破坏其他任务或OS内核使用的栈或数据存储器
  2. 避免非特权任务访问对系统可靠性和安全性很重要的外设
  3. 将SRAM或RAM空间定义为不可执行的(永不执行,XN),防止代码注入攻击

MPU使用

MPU相关函数位于头文件中

MPU寄存器

MPU存在多个寄存器,用于放置每个区域的配置和属性
大家仔细看图,可以发现,其实最重要的寄存器就4个
MPU类型寄存器MPU控制寄存器MPU区域编号寄存器MPU基地址寄存器MPU区域基本属性和大小寄存器
图中的地址,指的是存放在内存中的地址空间位置。(IOT设备一般情况下都是4G内存)。

1.MPU类型寄存器(MPU->TYPE)

MPU类型寄存器是用来确定MPU是否存在的。

2.MPU控制寄存器(MPU->CTRL)

MPU控制寄存器,是用来确认MPU是否开启的。

特别解释:PRIVDEFENA位是用来保证未被覆盖MPU控制区域覆盖的内存的访问权限的。
简单来说,MPU控制的区域并不一定能覆盖所有的内存空间,那么剩下的内存空间(也叫背景区域)的访问权限由PRIVDEFENA界定。总的来说,如果PRIVDEFENA置1,则背景区域只能被特权访问,如果置0,特权用户和普通用户都不能访问。 可以看一下图示: 大家看图还会发现一个问题,如果一个区域和另一个区域发生了重叠,应该如何决定特权?当区域发生重叠时,优先选择区域编号更大的寄存器设置的权限。
图中区域3和区域2发生了重叠,这块重叠部分的访问权限由区域3决定。

3.MPU区域编号寄存器(MPU->RNR)

MPU区域编号寄存器决定了当前要设置权限的区域编号。
因为MPU有8个区域,所以MPU->RNR只有低3位是有效的。
当我们要设置区域2的访问权限时,首先需要将MPU->RNR改为2,接着才能写这个区域的详细属性,即MPU->RBAR和MPU->RASR)

4.MPU基地址寄存器(MPU->RBAR)

顾名思义,写出了区域的起始地址

5.MPU基本属性和大小寄存器(MPU->RASR)

MPU基本属性和大小寄存器,包含了这个区域的详细的权限设置和区域的大小
其中,重点是5:1的REGIO大小属性
另一个重点是26:24的AP(即访问控制权限设置)

reference

书籍 《ARM Cortex-M3与Cortex-M4》