ARMv7的MPU
0. 简介
ARMv7的MPU(Memory Protection Unit,内存保护单元)主要作用是保护内存安全,防止非法访问和操作,提高系统的稳定性和安全性。
可以说,MPU是MMU(内存管理单元:支持虚拟内存和地址转换)的轻量级替代方案,与MMU不同,MPU是基于物理地址实现的,更适用于资源受限的实时嵌入式系统。
简单来说,MPU的核心作用可以概括为以下三点:
- 隔离与保护:划分不同内存区域(如代码、数据、外设),设置读写/执行权限,防止非法访问(如用户程序误改内核数据)。
- 特权级隔离:区分内核(特权模式)与用户程序(非特权模式),限制低权限代码访问关键资源。
- 实时系统支持:在RTOS中为不同任务分配独立内存区域,避免任务间相互干扰,增强稳定性。
如上所述,MPU更多的是应用于RTOS(实时操作系统)中,用于内核与用户程序的区分。
1. 运行模式与特权模式
ARMV7-M的两种运行模式:
- 线程模式:系统复位(进入复位中断)后处于该模式。
- 管理者模式:进入除了“复位中断”的其它中断后,处于该模式。
ARMV7-M 的两种特权等级,“有特权级”和“无特权级
- 有特权级:只要进入中断,将处于该等级。此时可以执行所有指令,访问所有寄存器。
- 无特权级:线程模式下,CONTROL.nPRIV为1,将处于该等级。此时执行指令和访问寄存器,都会受限。该等级下 CONTROL.nPRIV 为只读(写操作会被忽略),即无法通过将 CONTROL.nPRIV 写0来恢复“有特权级”。要想从“无特权级”切换到 “有特权级”模式,需要在 “无特权级”线程里产生一个中断,在中断处理过程中,把 nPRIV 值设为 0. 这是因为 CONTROL 寄存器在 “有特权级”可写,在中断处理时会自动切换到 “有特权级”模式。在实际情况中,一般是操作系统来编辑 nPRIV, 以此来控制 “无特权级” 和“有特权级”.
在管理者模式下,内核特权等级与CONTROL.nPRIV无关,将永远处于“有特权级”。
2. MPU的寄存器
2.1 MPU 类型寄存器 TYPE
MPU类型寄存器主要表示这个MCU有几个region
bit 位 |
名称 |
类型 |
描述 |
0 |
SEPARATE |
R |
处理器对指令(Instruction)和数据( |