MMU全称内存管理单元(Memory Management Unit),他有2个功能负责虚拟地址到物理地址的映射,还提供硬件机制的内存访问权限检查,这样可以保护进程使用的内存不会被其他进程说破坏。
1、地址的变换
在ARM CPU上的地址装换设计到3个概念,虚拟地址(VA),变换后的虚拟地址(MVA),物理地址(PA)
当没有开启MMU时,CPU,存储管理器,外设都是统一使用的物理地址,当启用MMU时,CPU发出的地址都是虚拟地址,转换成MVA供给MMU和caches使用,cache和MMU在变为PA,最后使用PA读写所有的实际设备。
所以启用MMU后:
1)CPU看到的用到的只是VA,至于VA如何落实到具体的物理地址CPU是不管的。
2)cache和MMU看不到VA,他们利用MVA获得PA。
3)实际的物理设备看不到VA和MVA,访问时用的都是PA
也就是CPU用的虚拟地址VA,外部设备用到虚拟地址是转换后的虚拟地址MVA,VA到MVA的变换如下:
当VA<32M时,需要使用进程ID号来转换MVA,这样是为了减少切换进程时的代价。
2、虚拟地址转换成物理地址
地址变换有2种方式,一种是通过数学公式(函数),另一种是建立表格把虚拟地址和物理地址一一对应起来,在MIPS架构体系下用的是前一种MVA=fun(VA),在ARM下用的是见表格(页表)的方法,页表的每一个条目存储了一段虚拟地址和对应的物理地址及其访问权限,s3c2440最多用到2级页表,一段(Section,1M)的方式进行装换时用到1级页表(4G/1M=4096个条目),以页的方式进行转换时用到的是二级页表,页的大小分为3种:大页(64KB),小页(4KB),极小页(1KB),一段里有多少页(段/页)。
转换的过程如下:
1)根据给定的虚拟地址找到一级页表中的条目,
2)如果此条目是段描述符,则返回物理地址,转换结束。
3)如果第二级页表描述符,继续利用虚拟地址在此二级页表中找到下一个条目。
4)如果第二个条目是页描述符,则返回物理地址,转换结束。
5)其他情况出错。
3、TLB全称是Translation Lookaside Buffers(转译查找缓存),作用类似于CPU的cache,只不过他是MMU的。当CPU发出一个虚拟地址时,MMU首先访问TLB,如果TLB中能找到,则直接用,若没找到,则要亲自访问页表查找,找到后一并把该条目写入TLB。
TLB用到的一些算法和cache很相仿,在S3C2440中内置了指令Cache(ICaches),数据Cache(DCaches),写缓存(Write Buffer).
关于主存和cache数据要保持一致主要有2中方法。
1)写穿法:就是把改变的数据写到cache同时也写到主存
2)回写法:只写到cache,不写到主存,到最后要替换数据的时候在让cache写入主存,相关的替换算法有先进先出,最少用到的优先等记不全了。
Cache的两个操作:
1)清空(clean):把cache中已经修改过的数据写入主存(清空DCache,使得主存数据得到跟新)
2)使无效(Ivalidate):使cache不能在使用,并不将修改过的数据写入主存(使无效ICache,使CPU从主存取得指令)
实际编程时需要注意以下几点:
1)开启MMU之前,使无效Icache,DCache,Write Buffer。
2)关闭MMU之前,清空ICache,DCache,Write Buffe。
3)如果代码有变,使无效ICache,让CPU从主存取指令。
4)使用DMA传输数据时,数据送入主存先要先清空Cache,若是从主存取数据,则取完数据后要无效Cache。
5)改变页表中的条目时也要慎重考虑TLB。
6)开启cache时,要考虑cache的内容是否与主存一致。
7)对于I/O地址空间不能使用cache和write buffer,如寄存器和非内存的外设。