两级页表怎么用?
来个假设先:我们需要将 0x0000 0000 开始的4KB映射到YA开始的4KB,显然仅用段映射无法实现,我们这里采用映射大小为4KB的小页操作。YA我们还不知道是多少,我们先假设转换表的基址为:0x1000 0000 因此,0x0000 0000 的虚拟地址所对就的转换表地址为0x1000 0000
我们假设先知道 0x1000 0000地址上的数据如下:
31 |
30 |
|
|
|
|
|
|
|
|
|
20 |
19 |
|
|
|
|
|
|
12 |
11 |
10 |
9 |
8 |
|
|
5 |
4 |
3 |
2 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
4 |
C |
8 |
8 |
D |
0 |
1 |
1 |
如位[1:0]可知,这是一个Coarse页表,
位[31:10]为Coarse页表的基址,这里为:0x132234
我们要转换的虚拟地址为 VA 0x0000 05A8
31 |
30 |
|
|
|
|
|
|
|
|
|
20 |
19 |
|
|
|
|
|
|
12 |
11 |
10 |
9 |
8 |
|
|
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
根据MMU中的小页转换过程,
先找出一级转换表中的地址,取得地址上的数据
TTB+VABit[31:20] <<2 =0x1000 0000 这个地址上的数据为Coarse页表描述符,数据我们已假设好,如上表。然后我们要根据这个描述符去寻找二级描述符。