一级页表:
TTB base代表一级页表的地址,将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可,一级页表的地址是16K对齐,使用[31:14]存储页表基址,[13:0]为0。一级页表使用4096个描述符来表示4GB空间,每个描述符对应1MB的虚拟地址,要么存储它对应的1MB物理空间的起始地址,要么存储下一级页表的地址。使用MVA[31:20]来索引一级页表(2^12=4096个描述符),得到一个描述符,每个描述符占4个字节。
一级描述符低两位:
00:无效(Fault)
01:粗页表(Coarse page table)
[31:10]为粗页表基址,此描述符低10位填充0后就是一个二级页表的物理地址,二级页表含256个条目([9:2]),
每个条目表示4KB大小的物理地址,一个粗页表表示1MB物理地址。
10:段(Section)
[31:20]为段基址,此描述符低20位填充0后就是一块1MB物理地址空间的起始地址。MVA[19:0]用来在这1MB空间中寻址。
以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下:
①页表基址寄存器位[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符
②取出段描述符的位[31:20](段基址),它和MVA[19:0]组成一个32位的物理地址(这就是MVA对应的PA)
11:细页表(Fine page table)
[31:12]为细页表基址(Fine page table base address),此描述符的低12位填充0后,就是一个二级页表的物理地址。
此二级页表含1024个条目([11:2]),其中每个条目表示大小1kb的物理地址空间,一个细页表表示1MB物理地址空间。
二级页表:
以大页(64KB),小页(4KB)或极小页(1KB)进行地址映射时,需要用到二级页表,二级页表有粗页表、细页表两种,二级页表描述符格式如下:
由于本次程序只使用一级页表,以段的方式进行地址映射。所以二级页表的4种情况就不总结了,看书。
内存的访问权限检查:
它决定一块内存是否允许读、是否允许写。这由CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位共同决定。
“域”决定是否对某块内存进行权限检查,“AP”决定如何对某块内容进行权限检查。
S3C2440有16个域,CP15寄存器C3中每两位对应一个域(一共32位)。
00:无访问权限(任何访问都将导致“Domain fault”异常)
01:客户模式(使用段描述符、页描述符进行权限检查)
10:保留(保留,目前相当于“无访问权限”)
11:管理模式(不进行权限检查,允许任何访问)
Domain占用4位,用来表示内存属于0-15,哪一个域,例如:
粗页表中的“Domain”为0b1010,表示1MB内存属于域10,如果域访问控制寄存器的[21:20]等于0b01,则使用描述符中的"AP"位进行权限检查,如果等于0b11,则不进行权限检查,允许任何访问。
AP、ap3、ap2、ap1、ap0结合CP15寄存器C1的R/S位,决定如何进行访问检查。
下表为AP、S、R的对照表
AP | S | R | 特权模式 | 用户模式 | 说明 |
00 | 0 | 0 | 无访问权限 | 无访问权限 | 任何访问将产生“Permission fault”异常 |
00 | 1 | 0 | 只读 | 无访问权限 | 在超级权限下可以进行读操作 |
00 | 0 | 1 | 只读 | 只读 | 任何写操作将产生”Permission fault“异常 |
00 | 1 | 1 | 保留 | - | - |
01 | x | x | 读/写 | 无访问权限 | 只允许在超级模式下访问 |
10 | x | x | 读/写 | 只读 | 在用户模式下进行写操作将产生"Permission fault"异常 |
11 | x | x | 读/写 | 读/写 | 在所有模式下允许任何访问 |
xx | 1 | 1 | 保留 | - | - |
转译查找缓存(Translation Lookaside Buffers, TLB)
Cache:
S2C2440内置了指令Cache(ICaches)、数据Cache(DCaches)、写缓存(Write buffer),需要用到描述符中的C位(Ctt)和B位(Btt)。
S3C2440 MMU、TLB、Cache的控制指令:
S3C2440除了ARM920T的CPU核心外,还有若干个协处理器,用来帮助主CPU完成一些特殊功能。对MMU、TLB、Cache等的操作涉及到协处理器。
<MCR|MRC> {cond} p#,<expression1>,Rd,cn,cm{,<expression2>}
MRC //从协处理器获得数据,传给ARM920T CPU核心寄存器
MCR //数据从ARM920T CPU核心寄存器传给协处理器
{cond} //执行条件,省略时表示无条件执行
p# //协处理器序号
<expression1> //一个常数
Rd //ARM920T CPU核心的寄存器
cn和cm //协处理器中的寄存器
<expression2> //一个常数
其中,<expression1>、cn、cm、<expression2>仅供协处理器使用,它们的作用如何取决于具体的协处理器。