热门文章
MPU也就是我们通常说的存储器保护单元,它可以为微控制器或片上系统(SOC)提供存储器保护特性,而且会提高所开发产品的健壮性。MPU在使用前需要进行编程使能,若MPU未使能,存储器系统的行为同没有MPU时一样。当然有的支持MPU特性,有的没有。
MPU是一种可编程的部件,用于定义不同存储器区域的存储器访问权限(如只支持特权访问或全访问)和存储器属性(如可缓冲、可缓存)。
MPU可以通过以下方面提高嵌入式系统的健壮性:
l 避免应用任务破坏其他任务或OS内核使用的栈或数据存储器。
l 避免非特权任务访问对系统可靠性和安全性很重要的外设。
l 将SRAM或RAM空间定义为不可执行的,防止代码注入攻击。
l 检测不可预期的存储器访问(例如,栈被破坏)。
还可以利用MPU定义其他存储器属性,如可被输出到系统缓存单元或存储器控制器的可缓存性。
若存储器访问和MPU定义的访问权限冲突,或者访问的存储器位置未在已编程的MPU区域中定义,则传输会被阻止且触发一次错误异常。触发的错误异常处理可以是存储器管理错误或者HardFault异常,实际情况取决于当前的优先级及存储器管理错误是否使能。然后异常处理就可以确定系统是否应该复位或只是OS环境中的攻击任务。
在使用MPU前需要对其进行设置和使能,若未使能MPU,处理器会认为MPU不存在。若MPU区域可以出现重叠,且同一个存储器位置落在两个MPU区域中,则存储器访问属性和权限会基于编号最大的那个区域。例如,若某传输的地址位于区域1和区域4定义的地址范围内,则会使用区域4的设置。
MPU的设置方法有多种。
对于没有嵌入式OS的系统,MPU可以被编程为静态配置。该配置可用于以下功能:
l 将RAM/SRAM区域设置为只读,避免重要数据被意外破坏。
l 将栈底部的一部分RAM/SRAM空间设置为不可访问的,以检测栈溢出。
l 将RAM/SRAM区域设置为XN,避免代码注入攻击。
l 定义可被系统级缓存(2级)或存储器控制器使用的存储属性配置。
对于具有嵌入式OS的系统,在每次上下文切换时都可以配置MPU,每个应用任务都有不同的MPU配置。这样可以:
l 定义存储器访问权限,使得应用任务只能访问分配给自己的栈空间,因此可以避免因为栈泄漏而破坏其栈。
l 定义存储器访问权限,使得应用任务只能访问有限的外设。
l 定义存储器访问权限,使得应用任务只能访问自己的数据或自己的程序数据(设置起来可能会有麻烦,因为多数情况下OS和程序代码是一起编译的,因此数据在存储器映射中也可能是混在一起的。)
如果需要的话,具有嵌入式OS的系统还可以使用静态配置。
简单应用大多不需要使用MPU,MPU默认为禁止状态,而且系统运行时它就如同不存在一样。在使用MPU前,需要确定程序或应用任务要访问(以及允许访问)的存储器区域:
l 包括中断处理和OS内核在内的特权应用的程序代码,一般只支持特权访问。
l 包括中断处理和OS内核在内的特权应用使用的数据存储器,一般只支持特权访问。
l 非特权应用的程序代码,全访问。
l 非特权应用(应用任务)的栈等数据存储器,全访问。
l 包括中断处理和OS内核在内的特权应用使用的外设,只支持特权访问。
l 可用于非特权应用(应用任务)的外设,全访问。
在定义存储器区域的地址和大小时,注意区域的基地址必须要对齐到区域大小的整数倍上。例如,若区域大小为4KB(0x1000),起始地址必须为N X 0x1000,其中N为整数。
若使用MPU的目的是防止非特权任务访问特定的存储器区域,则可以利用背景区域特性减少所需的设置步骤。只需设置非特权任务所用的区域,而利用背景区域,特权任务和异常处理则对其他存储器空间具有全访问权限。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。
文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。