Appearance
MPU
内存保护单元
- 设置不同存储区域的访问权限(特权级以及用户级)
- 设置存储器(内存, 外存)的属性(可以缓存, 可缓冲, 可共享)
好处
- 可以阻止用户的应用程序破坏操作系统的数据
- 阻止一个任务访问其他的任务
- 把关键位置的数据设置为只读, 根本上解决被破坏
- 防止意外的地址访问, 比如说堆栈溢出, 数组越界等
- 把SRAM和RAM空间定义为不可执行, 防止注入代码的攻击
提高兼容性
背景区就是一个默认的设置
- 可缓冲, 可缓存
可以减少数据的读写次数,如果每次数据只传输一点数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。
缓存(cache)与缓冲(buffer)的主要区别
Buffer的核心作用是用来缓冲,缓和冲击。比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。 Cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。 简单来说就是buffer偏重于写,而cache偏重于读。
- 可共享
寄存器
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 控制。
- M3
通过把PRIVDEFENA置位,可以在没有建立任何region就使能MPU的情况下,依然允许特 权级程序访问所有地址,而只有用户级程序被卡死。然而,如果设置了其它的region并且使 能了MPU,则背景region与这些region重合的部分,就要受各region的限制。
要注意,只要没有极另类的考虑,就要要到万事就绪后,最后一步才置位ENABLE位。 否则,就有可能因region没有配置好而意外地产生MemManage fault。很多条件下,为安全 起见,最好在执行配置MPU的子程前先除能MPU,待执行后再重新使能MPU。
这几个策略对应上面的命中没有命中的时候的处理方式