分类:
2007-10-20 16:27:50
Memory Management Unit——MMU,内存管理单元
本章描述基于MMU的内存体系结构。它包括如下部分:
l 关于MMU构架,B3-2
l 内存访问顺序,B3-4
l 翻译过程,B3-6
l 访问权限,B3-16
l 域,B3-17
l 异常,B3-18
l CP15寄存器,B3-23
3.1 关于MMU构架
内存管理单元(MMU)内存体系结构提供对内存系统的精密(fine-grained)控制。大部分细节控制是通过存储在内存中的翻译表(translation tables)来完成的。表中的条目(entries)定义了不同大小的内存区域(从1KB到1MB)的属性特征。这些特征包括:
虚拟到物理地址映射:
由ARM处理器产生的地址称为虚拟地址(virtual address,也称逻辑地址)。MMU允许该地址映射到一个不同的物理地址。物理地址决定了要访问的主存地址。
很多情况下都可以使用这种方法来指派物理内存地址。例如,为多个不同的可能存在潜在的地址冲突的进程分派地址,或者让一个稀疏地址映射的应用程序使用物理内存中的一块连续区域。
——Note——
如果使用了快速上下文交换扩展(Fast Context Switch Extension,见Chapter B6),则本章所指的虚拟地址皆为快速上下文交换扩展所产生的修正的虚拟地址(modified virtual address)。
——————
内存访问权限
这对一个程序是否有权对内存区域进行访问、只读访问还是读写访问等进行控制。当访问被禁止时,存储器异常将报告到ARM处理器。
所认可的访问级别还受到程序是运行于用户模式还是特权模式的影响,另外还有域的使用的影响(见Domains,B3-17)。
高速缓存和缓冲位(C和B)
具体描述见Cachability and bufferability,B5-8。
系统控制协处理器寄存器允许对该系统的高级控制,比如翻译表的位置。这些寄存器通常也向ARM提供关于存储器异常的状态信息。
对翻译表的全面查找过程叫做翻译表遍历(translation table walk)。它由硬件自动执行,并且会耗费大量执行时间(至少一个主存访问,通常是两个?)。为减少内存访问的平均耗时,将翻译表遍历的结果保存到一个或多个称为翻译后援存储器[2](Translation Lookaside Buffer,一译为转译旁观缓冲区[3],TLB)的结构中。通常在ARM的实现中,每一个存储器接口都有一个TLB:
l 仅有单个存储器接口的系统通常只有一个统一的TLB;
l 有独立的指令和数据存储器接口的系统通常有独立的指令和数据TLB。
如果系统还包含一个或多个高速缓存(cache),则高速缓存的数目通常也以同样的方式定义(见Unified or separate caches,B5-5)。因此在有高速缓存的系统中,通常是一个TLB对应一个高速缓存。
当存储器中的翻译表发生改变或者选择了不同的翻译表时(通过写CP15寄存器2来实现),则此前保存在TLB中的翻译表遍历结果很可能不再有效。因此MMU结构还提供刷新TLB的操作。
MMU结构还允许特定的翻译表遍历结果锁定到一个TLB中。这确保了对相关存储区域的访问绝不会引起翻译表遍历操作,这与将指令和数据锁定到高速缓存中对实时代码的好处有异曲同工之妙(见Register 9:Cache lockdown,B5-18)。
3.2 内存访问顺序
当ARM发起存储器访问时,MMU首先在TLB中查找该次访问的虚拟地址。如果在实现上有独立的数据和指令TLB,则使用:
l 指令TLB用于取指令
l 数据TLB用于任何其他类型的访问
如果TLB中不包含该虚拟地址的条目(entry,一说入口或快取),则调用翻译表遍历硬件来从保存在主存中的翻译表获取地址转换以及访问权限信息。一旦获取,相关信息就放入到TLB中,要么使用一个目前未使用的entry,要么覆盖一个已存在的entry。对于翻译表的描述以及翻译表遍历的执行过程见Translation process,B3-6。
一旦获取了存储器访问的TLB entry,则其中包含的信息使用如下:
1.C(cachable)和B(bufferable)位用于控制高速缓存和写缓冲,并决定该访问是否通过高速缓存,具体描述见Cachability and bufferability,B5-8。(若系统没有高速缓存或写缓冲,则忽略相关位。)
2.访问权限位和域用于决定是否允许访问。如果访问是不允许的,则MMU向ARM处理器发出存储器异常信号。否则可进行访问。
该处理过程的详细描述可见Access permissions(B3-16),Domains(B3-17)和Aborts(B3-18)的相关部分。
3.对于不经由高速缓存的内存访问(包括在没有高速缓存的系统中的所有内存访问),物理地址用作对主存进行访问的地址。
对于使用高速缓存的内存访问,物理地址用作未命中高速缓存时的line fetch地址(Cacheline是Cache与内存交换数据的基本单位,又称Cache的组织宽度,例如ARM9E中为4个字即32个字节;这里未命中cache,所以要从内存中取数据存到cache中)。若命中高速缓存,则物理地址被忽略。
图3-1 对高速缓存系统的说明
3.2.1 使能和禁止MMU
通过对系统控制协处理器的寄存器1的bit[0]进行写操作可以对MMU的使能或禁止进行控制。一旦复位,该位清零,于是MMU在复位后会被禁止。
在MMU被禁止时,存储器访问如下处理:
l 当MMU被禁止时,是否允许使用高速缓存和写缓冲是由ARM芯片的具体实现来定义的(IMPLEMENTATION DEFINED)。
——若MMU被禁止时不允许使用高速缓存和写缓冲,则C和B位的值与内存访问无关;
——若MMU被禁止时允许使用高速缓存和写缓冲,则数据访问被认为不可用高速缓冲和写缓冲(C==0,B==0)。取指令时,若在仅有一个统一的TLB的系统中,则认为不可高速缓存(C==0),若在有独立的指令TLB的系统中,则认为可经由高速缓存访问(C==1)。
l 不进行内存访问权限的检查,并且MMU不会发出异常信号。
l 每次访问时的物理地址等同于它的虚拟地址(这称为平坦型地址映射)。
在使能MMU之前,必须首先在存储器中建立起合适的翻译表并且对相关的CP15寄存器进行设置。
——Note——
使能或禁止MMU有效地改变了虚拟到物理地址的映射(除非翻译表被建立为基于对平坦型地址映射的实现)。因而很可能发生这种情况,比如,任何在这个时候使能的高速缓存必须进行刷新(见Address mapping changes,B5-10)。
此外,如果对MMU进行使能或禁止的代码的物理地址与其虚拟地址不一样,指令的预取则可能导致混乱(见Prefetching and self-modifying code,A2-17)。因此,强烈建议用于对MMU进行使能或禁止的代码(code)具有相同的虚拟和物理地址。
——————
[参考资料]
[1]ARM Architecture Reference Manual,Sencond Edition,by David Seal and Addison Wesley. Download this manual:
[2]
[3]
[4]ARM体系结构与编程,杜春雷,清华大学出版社,2003年2月