MMU,MMU由单一的存于内存的两级页表控制。为什么是两级?
TLB用来做什么?在哪里?指令TLB和数据TLB分别用来做什么?
标准的ARMv4MMU重映射大小,域入访问保护机制
映射大小为1MB的段,64KB的大页,4KB的小页和1KB的微页
段的访问允许控制
大页及小页的访问允许控制由它的子页控制,微页则没有访问控制
硬件16个域CP15中Reg3为域访问控制 (域用来做什么?)
64个转换入口的指令TLB及数据TLB
Round-Robin替代算法,Reg1 bit14 使能该算法,做什么的?
Reg8 禁止整个TLB入口
Reg8禁止指令MVA的TLB入口
Reg10分别锁定指令及数据TLB
访问允许及域
每一个内存块都有一个与它相关联的域,一个域是内存块的首要访问控制机制,它定义了一个访问是否被处理。CP15 reg3每两个位控制一个域的访问允许:
00 No Access 所有访问都将产生一个域错误
01 Client 访问由段或页描述符检查
10 保留
11 管理模式 访问不被检查,不产生错误
其实我们所要了解的就是从虚拟地址到物理地址需要经过哪些过程,怎么一级级地被转换?
转换入口:
每个TLB缓存了64个转换入口,在CPU访问内存 期间,TLB给访问控制逻辑提供保护信息。如果TLB包含了一个MVA的转换入口,访问控制逻辑决定该访问是否被允许:
如果访问被允许,以及需要片外访问,MMU输出所对应的物理地址。(怎么输出?)
如果访问被允许,以及不需要片处访问,由Cache来服务该访问。
如果访问不被允许,MMU提示CPU内核中止。
(访问允许在哪里控制?)
手册中还提到:
如果TLB不包含该虚拟地址的转换入口,转换表遍历硬件将从存于物理内存中的转换表得到信息,并写入TLB。
不是很懂。。。先往下看
地址转换
MMU转换虚拟地址到物理地址,并且使用TLB来检查访问允许。(TLB用来做什么?检查访问允许)
MMU转换表遍历硬件是用来将入口加入TLB。存于物理内存的转换表提供了转换地址数据及权限信息数据组成了转换信息。
对转换表遍历硬件来说,这里有两种级别,这取决于地址被标记为段还是页映射访问。
有一种大小的段访问及三种大小的页访问。但转换过程的开始阶段是一样的,都从一级预取开始,一个段的映射访问仅需要一级预取,而页的映射访问则需要二级预取。
来个实例分析一下:
假设我现在的有一块SDRAM内存,32MB大小,地址从0x30000000开始,现我需要实现将0开始的中断向量表重映射到0x30000000开始,而其他虚拟地址与物理地址一致,线性连续。
为了使问题简单,可以仅使用段映射访问,这样的话,只需一级预取。我该怎么配置MMU实现该功能呢?
硬件转换过程
TTB转换表基址
CP15中的Reg2为转换表基址寄存器,16KB对齐,存于物理内存,也就是说,从这个地址开始的内存空间上的数据都为段或页的描述符。最多4096个入口,每个1MB,因此最大可以寻址4GB空间。
假设我们让MMU做地址转换,转换的结果是,虚拟地址与物理地址一致。而且仅使用段描述符。
这时,转换表中的4096个入口将为段描述符,格式如下:
31 |
30 |
|
|
|
|
|
|
|
|
|
20 |
19 |
|
|
|
|
|
|
12 |
11 |
10 |
9 |
8 |
|
|
5 |
4 |
3 |
2 |
1 |
0 |
段基址 |
|
AP |
|
Domain |
1 |
C |
B |
1 |
0 |
位[1:0]表示描述符类型,10表示段描述符。
这个段基址将与描述符在转换表中的偏移量一致。
地址为{TTB+i}上的内存数据为(i<<20)|其它属性
位[8:5]表示所使用的域,这个域与Reg3的域访问控制相对应.
现在来做一次转换:假设虚拟地址为0x12345678, TTB=0x3000 0000 其它属性为0x01e,使用域0,并且假设域0访问控制使能。
也就是说0x3000 0000-0x3000 3ffc 上4096个数据分别为 0x0000 001e - 0xfff0 001e
虚拟地址展开为
31 |
30 |
|
|
|
|
|
|
|
|
|
20 |
19 |
|
|
|
|
|
|
12 |
11 |
10 |
9 |
8 |
|
|
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
它转换时先取得虚拟地的 31:20位,在此为:0x123
然后根据TTB+(0x123<<2)=0x3000 048C 取得转换入口的内存地址:
然后得到这个地址上的数据:0x1230 001e 因此这个段基址为 0x123
最后,段基址<<20位,再并上虚拟地址的19:0得出物理地址:0x123 45678