在Cortex‐M3处理器中可以选配一个存储器保护单元(MPU),它可以实施对存储器(主要是内存和外设寄存器)的保护,以使软件更加健壮和可靠。在使用前,必须根据需要对其编程。如果没有启用MPU,则等同于系统中没有配MPU。MPU有如下的能力可以提高系统的可靠性:
阻止用户应用程序破坏操作系统使用的数据
阻止一个任务访问其它任务的数据区,从而把任务隔开。
可以把关键数据区设置为只读,从根本上消除了被破坏的可能。
检测意外的存储访问,如,堆栈溢出,数组越界。
此外,还可以通过MPU设置存储器regions的其它访问属性,比如,是否缓区,是否缓冲等。
MPU在执行其功能时,是以所谓的“region”为单位的。一个region其实就是一段连续的地址,只是它们的位置和范围都要满足一些限制(对齐方式,最小容量等)。CM3的MPU共支持8个regions。怎么,嫌少?是少了点,不过,还允许把每个region进一步划分成更小的“子region”。此外,还允许启用一个“背景region”(即没有MPU时的全部地址空间),不过它是只能由特权级享用。在启用MPU后,就不得再访问定义之外的地址区间,也不得访问未经授权的region。否则,将以“访问违例”处理,触发MemManage fault。
MPU定义的regions可以相互交迭。如果某块内存落在多个region中,则访问属性和权限将由编号最大的region来决定。比如,若1号region与4号region交迭,则交迭的部分受4号region控制。
详细介绍在《cortex-m3权威指南》--存储保护单元MPU