MMU的做用

MMU(Memory Management Unit,内存管理单元)在现代处理器中扮演着很是重要的角色。操做系统经过使用处理器的MMU功能,能实现如下功能:
    1)虚拟内存。有了虚拟内存,能够在处理器上运行比实际物理内存大的应用程序。为了使用虚拟内存,操做系统一般要设置一个交换分区(一般是硬盘),经过将不活跃的内存中的数据放入交换分区,操做系统能够腾出其空间来为其它的程序服务。虚拟内存是经过虚拟地址来实现的。
    2)内存保护。根据须要对特定的内存区块的访问进行保护,经过这一功能,咱们能够将特定的内存块设置成只读、只写或是可同时读写。
    
在嵌入式系统中,一般不会使用虚拟地址这一功能,由于它会使得任务的调度时间不具肯定性。还有另外一个缘由就是,嵌入式系统的存储空间一般很小,有的只采用FLASH做为存储介质,并无特定的空间用作交换分区。那在嵌入式系统中,MMU会用来作内存保护吗?是的,MMU在嵌入式系统中主要是用来作内存保护用的。还记得《程序中的段》中所提到的.text段和.rdata段吗?咱们说这两个段一般是相邻放在连续的内存块中的,且这块内存会是只读的,而这就须要MMU来帮忙了!将这两个段所在的内存区块设置成只读的目的是,能够防止其内容被出错的程序意外的改写了。对于设置成只读的内存区当被意外的改写时,处理器会产生一个段异常,而操做系统则利用这一异常产生一个core(或dump)文件。经过这一文件,咱们能够分析出是哪一段程序试图去改写只读内存的。应当说采用了内存保护的方法,可能使得程序出错时,咱们找到问题的根源会相对的容易和快,由于其更接近出错的程序点。若是不具备内存保护功能,那么有可能程序去改写.text或.rdata段所在的区块时,还能运行,最后出错的地方可能离实际的出错点更为的“远”。
   
那是谁来负责将.text和.rdata段设置成只读的呢?一般这能够在咱们的应用程序在初始化操做系统时完成。
   
对于MMU的一个特性咱们在此不得不说起,MMU中存在页的概念,对于全部的MMU功能其操做都是以页的大小来进行的。好比,对于32位的x86处理器其页的大小是4K字节。在采用MMU设置内存的读写属性时,咱们必须将页的起始地址做为设置参数,且这一地址必须是页的整数倍,k或者说地址必须是页对齐的。那从嵌入式系统开发的角度来看,咱们须要注意什么呢?咱们必须保护.text的起始地址必须是页对齐的,这是经过设置链接器的脚原本达到目的,即将.text段的起始地址设置成以页大小进行对齐,还有吗?先看图 1,为了解释方便咱们假设.rdata段也在.text段中,且.text的起始地址已经采用链接器脚本设置成了页对齐的。
ide


图 1
咱们说了对于MMU的操做是以页来进行的,那咱们得保证.text的大小是页的整数倍,那如何保证?很简单,将.data段的起始地址也经过链接器脚本设置成页对齐就好了。这样看来,为了使用MMU,可能会形成一点点的内存空间浪费,由于当.text的大小不是页的整数倍时,咱们得将其变成页的整数倍,即实际的.text段与.data段可能会有空隙。图 2中示例了将.text段和.data段的起始地址设置成页对齐。

图 2

致读者

若是你想参与讨论嵌入式开发相关的话题,请加入技术圈(
g.51cto.com/UltraEmbedded )。
相关文章
相关标签/搜索