分类: LINUX
2012-11-21 23:06:46
什么是MMU
MMU存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB到1MB的各种存储器区域的属性。这些属性包括:
虚拟地址到物理地址映射
存储器访问权限
高速缓存和缓冲位
TLB
查找整个转换表的过程叫转换表遍历。它由硬件制动进行,并需要大量的执行时间(至少一个存储器访问,通常是两个)。为了减少存储器访问的平均消耗,转换表遍历结果被高速缓存在一个或多个叫作TLB的结构中。通常在ARM的实现中每个内存接口有一个TLB。
内存访问过程
1. 当CPU请求存储器访问时,首先在TLB中查找虚拟地址。
2. 如果该虚拟地址对应的地址描述符不在TLB中时,读取内存中页表查询,并将该描述符添加到TLB中,如果TLB已满,根据一定算法进行替换。
3. 通过TLB缓存或者通过页表查询得到描述符,从描述符表中得到对应的物理地址
4. 根据域访问控制和描述符中AP位确定是否允许对该内存进行操作。如不,则产生存储访问中止中断。
5. 如访问被允许,根据描述符表中CB位决定是否缓存该内存的访问结果,如不,则根据得到的物理地址直接访问内存。
6. 如缓存被允许,则首先在CACHE中查找,命中则直接读取,如未命中,则根据物理地址直接访问内存,并将该数据读取到CACHE中。
ARM920T CP15协处理器介绍
ARM的虚拟地址管理主要通过CP15相关寄存器来实现的,CP15包括了16个32位寄存器,编号为0~15,实际上对于某些编号的寄存器可能对应有多个物理寄存器,在指令编码时指定标志位来区分。
编号 | MMU功能 |
C0 | ID编码(只读) |
C1 | 开启/禁止MMU/CACHE/WRITE等功能 |
C2 | 地址转换表基地址 |
C3 | 域访问控制 |
C4 | 保留 |
C5 | 内存失效状态 |
C6 | 内存失效状态 |
C7 | CACHE及WRITE控制 |
C8 | TLB控制 |
C9 | CACHE锁定 |
C10 | TLB锁定 |
C11 | 保留 |
C12 | 保留 |
C13 | 进程PID |
C14 | 保留 |
C15 |
CP15寄存器的读写
MCR ARM寄存器到协处理器寄存器数据传送
MRC 协处理器寄存器到ARM寄存器数据传送
格式:
MCR/MRC P15,0,
其中RD为ARM寄存器
CRN为协处理器寄存器
CRM附加的目标寄存器或源操作数寄存器,用于区分一个编号的不同物理寄存器
MCR P15,0,R4,C1,C0,0 R4->C1
MRC P15,0,R4,C1,C0,0 R4<-C1
ARM920T 一级、二级页表的组织介绍
描述符定义:
第一级段、粗页和细页描述符 | ||||||||||||||||
类型 | 31 20 | 19 12 | 11 | 10 | 9 | 8 5 | 4 | 3 | 2 | 1 | 0 | |||||
粗页 | 二级页表基地址[31:10] | Domain | 1 | 0 | 1 | |||||||||||
段 | 物理地址基地址[31:20] | AP | Domain | 1 | C | B | 1 | 0 | ||||||||
细页 | 二级页表基地址[31:12] | Domain | 1 | 1 | 1 | |||||||||||
第二级极大页、小页和极小页描述符 | ||||||||||||||||
31 16 | 15 12 | 11 | 10 | 9 8 | 7 6 | 5 4 | 3 | 2 | 1 | 0 | ||||||
极大 | 物理地址基地址[31:16]64k | Ap3 | Ap2 | Ap1 | Ap0 | C | B | 0 | 1 | |||||||
小页 | 物理地址基地址[31:12]4k | Ap3 | Ap2 | Ap1 | Ap0 | C | B | 1 | 0 | |||||||
极小 | 物理地址基地址[31:10]1k | ap | C | B | 1 | 1 |
ARM对一级、二级页表的组织有多种情况,这里不对多种情况做细致的分析,主要分析一种情况就是一级是粗页,二级页表是小页的情况。
协处理地址转换页表遍历的过程如图所示。虚拟地址的31~20位表示一级页表的索引值,通过cp15 c2寄存器保存的一级页表基地址值,根据这个索引,可以找到一级页表中的页表项。下面例子中的页表项是一个粗表项。一个粗表项记录了一个二级页表。这个二级页表的大小为1K(每个表项为4字节,一共有256个表项),根据虚拟地址中的19~12位,可以在二级页表中找到对应的页表项。在下面的例子中二级页表项为小页,一个表项记录了一个4K物理内存的基地址,根据虚拟地址的最后11~0位,可以访问到这个4K地址中的任意内存值。