理解与应 MPU 的特权与用户模式
前言
STM32 系列支持 MPU 内存保护单元,可用来设定内存的属性和访问权限。MPU 的应用笔记提到,将属性寄存器
MPU_RASR)配置成某一个值,在特权(Privileged permissions)和用户模式(Unprivileged permissions)的访问许可是不同
的,甚至可将用户模式的权限设置成不可访问。那么,什么是 MPU 的特权模式和用户模式呢? 接下来我们在这篇文章来理
解这些名词,并讨论在 STM32 MCU 代码中如何使用内存保护单元 MPU 的特权与用户模式。
MPU(Memory Protection Unit)
MPU 内存保护单元可以用来使嵌入式系统更加健壮与安全。它可以阻止用户应用程序破坏系统关键数据。它可以通过将内存
SRAM 区域定义成不可执行,来阻止代码注入型攻击。也可以用来改变内存的性质,例如是否允许缓存(Cache)
用来设置内存属性的 MPU_RASR 寄存器字段描述如下:
名字
描述
28
XN
从不执行
26 : 24
AP
数据访问许可(RO, RW 或者无权限)
21 : 19
TEX
类型扩展字段
18
S
共享
17
C
可缓存
16
B
可缓冲
15 :8
SRD
禁止子块
5 :1
SIZE
指定 MPU 保护区域的大小
图表
1 MPU_RASR
字段
MPU_RASR 中用来设置数据访问许可的 AP 字段详细设置选项如下:
AP[2 :0]
特权模式
用户模式
描述
000
不可访问
不可访问
所有的访问产生一个内存管理异常
001
RW
不可访问
仅可从特权模式访问
010
RW
RO
在用户模式下的写访问会产生内存管理异常
011
RW
RW
完全访问
100
不可预知
不可预知
保留
101
RO
不可访问
仅可在特权模式下进行读访问
110
RO
RO
特权和用户模式只读
111
RO
RO
特权和用户模式只读
图表
2
内存访问权限设置
特权模式(Privileged mode)与用户模式(UnPrevileged mode)
特权模式与用户模式是指 Cortex 内核的执行模式。它不是 MPU 的一部分,但与 MPU 单元有关联。当代码运行在特权模式下,
代码拥有所有访问许可;代码运行在用户模式,则访问权限受限制限制包括在系统设计阶段就定义的可运行指令限制
可访问内存以及外设限制。也包括由 MPU 单元动态所定义的内存访问规则。
从特权模式进入用户模式,只需使用 MSR 指令操作 CONTROL 寄存器。但是,不可以直接从用户模式转入特权模式,必须
经过一个异常处理操作模式,比如 SVC Supervisor Calls。在异常处理通过操作 CONTROL 寄存器,可从用户模式回
到特权模式。请注意,特权线程与异常处理线程,都是在特权模式下运行。
如下图所示:
在代码中结合特权与用户模式使用 MPU
1. 开发环境
开发板: STM32 L476RG NUCLEO
开发工具:STM32Cube_FW_L4_V1.7.0
IAR/Keil
注:也可以选择其他 STM32 系列并选择相应的开发板与固件库。
2. 开发目标定义
在软件中定义一块数组,使用 MPU 将该区域配成仅可从特权模式下进行访问,并验证用户模式下访问会导致内存管理异
常或者硬错误。
AP[2 :0]
特权模式
用户模式
描述
001
RW
不可访问
仅可从特权模式访问
SVC
特权线程
异常处理
用户线程
操作 CONTROL 寄存器
图表
3
特权模式与用户模式的切换