内存保护单元(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,禁止缓冲

}