内存保护单元(memory protection unit),简称:MPU。使用 MPU 可以设置不同存储区
域的存储器访问特性(如只支持特权访问或全访问)和存储器属性(如可缓存、可共享),从而
提高嵌入式系统的健壮性,使系统更加安全
MPU,即内存保护单元,可以设置不同存储区域的存储器访问特性(如只支持特权访问或
全访问)和存储器属性(如可缓存、可缓冲、可共享),对存储器(主要是内存和外设)提供保
护,从而提高系统可靠性:
1,阻止用户应用程序破坏操作系统使用的数据。
2,阻止一个任务访问其他任务的数据区,从而隔离任务。
3,可以把关键数据区域设置为只读,从根本上解决被破坏的可能。
4,检测意外的存储访问,如堆栈溢出,数组越界等。
5,将 SRAM 或者 RAM 空间定义为不可执行(用不执行,XN),防止代码注入攻击。
注意,MPU 不仅可以保护内存区域(SRAM 区),还可以保护外设区(比如 FMC)。我们
可以通过 MPU 设置存储器的访问权限,当存储器访问和 MPU 定义的访问权限相冲突的时候,
则访问会被阻止,并且触发一次错误异常(一般是 MemManage 异常)。然后,在异常处理的时
候,就可以确定系统是否应该复位或者执行其他操作。
具体对应stm32h743单片机的程序代码如下所示:
//设置需要保护的存储块
//必须对部分存储区域进行 MPU 保护,否则可能导致程序运行异常
//比如 MCU 屏不显示,摄像头采集数据出错等等问题...
void MPU_Memory_Protection(void)
{
//保护整个内部 FLASH 区域,共 2M 字节,禁止共用,允许 cache,允许缓冲
MPU_Set_Protection(0x20000000,128*1024,1,MPU_REGION_FULL_ACCESS,0,1,1);
//保护整个 DTCM,共 128K 字节,禁止共用,允许 cache,允许缓冲
MPU_Set_Protection(0x24000000,512*1024,2,MPU_REGION_FULL_ACCESS,0,1,1);
//保护整个 AXI SRAM,共 512K 字节,禁止共用,允许 cache,允许缓冲
MPU_Set_Protection(0x30000000,512*1024,3,MPU_REGION_FULL_ACCESS,0,1,1);
//保护整个 SRAM1~SRAM3,共 288K 字节,禁止共用,允许 cache,允许缓冲
MPU_Set_Protection(0x38000000,64*1024,4,MPU_REGION_FULL_ACCESS,0,1,1);
//保护整个 SRAM4,共 64K 字节,禁止共用,允许 cache,允许缓冲
MPU_Set_Protection(0x60000000,64*1024*1024,5,MPU_REGION_FULL_ACCESS,0,0,0);
//保护 MCU LCD 屏所在的 FMC 区域,,共 64M 字节,禁止共用,禁止 cache,禁止缓冲
MPU_Set_Protection(0XC0000000,32*1024*1024,6,MPU_REGION_FULL_ACCESS,0,1,1);
//保护 SDRAM 区域,共 32M 字节,禁止共用,允许 cache,允许缓冲
MPU_Set_Protection(0X80000000,256*1024*1024,7,MPU_REGION_FULL_ACCESS,0,0,0
);//保护整个 NAND FLASH 区域,共 256M 字节,禁止共用,禁止 cache,禁止缓冲
}