本文共 1090 字,大约阅读时间需要 3 分钟。
给个链接
1. 段, 大页, 小页, 极小页的划分
4种映射长度:段(1MB)、大页(64KB)、小页(4KB)、极小页(1KB)。
ok, 以这个为前提, 我们设计mmu 两级页表的方式。
假设, 需要寻址 0x12345678这个虚拟地址。
已知它对应的页是0x56789000页, 即真实的物理地址为0x56789678。
我们考虑二级页表该如何设计。
以二级页表方式寻址。
将0~4G空间 4K 一页为单位, 分成1024*1024个页。
256个页组成1M 称之为段。(Section)
4K 的大小为0x0 1000
1M 的大小为0x10 0000
4K 一页, 分页后
0x0000 0000
0x0000 1000
0x0000 2000
0x0000 3000
....
1M 一段, 分段后
0x0000 0000
0x0010 0000
0x0020 0000
0x0030 0000
0x0040 0000
....
共计4096个段,
故虚拟地址前12字节, 0x123 可以作为段的寻址序号。
即以及页表的第0x123个就是我要找的段地址页表。
这个页表在哪里, 首先需要找到段页表地址的基地址, 这个存在cp15协处理器的某个寄存器中(忘记是C1还是C2啥的了)
ok, 读取段页表基地址, 假设是0xC100 0000, 其中每个页表项是32位整数, 即4byte
所以, 寻找到第0x123个页表项, 地址为 0xC100 0| 0100 | 1000 | 1100, 即为 0xC100 048C
ok, 找到一级段地址页表项了。 我们就能找到实际的映射的段物理地址了。 是的0xC100 048C中存放的32位数中,
我们想想这个32位段页表项该存放写什么??
没错, 要存放二级页表的基地址。 假设是0xC300 0000....
ok, 二级页表项的具体位置该如何明确呢??
先说结论, 虚拟地址的第12位到第19位这8位数据就是页表项的序号。
1). 二级页表应该有256个。
2). 前12位0x123为段地址的序号。
3). 中间8位0x45是页表项的序号。
中间8位数字, 刚好可以表示0x00 ~ 0xFF共256个页表项目的序号
ok, 我们找到0xC300 0000的第0x45号页表项。
里面存放这最终的物理页地址。即0x56789000页, 该页表的基地址为就是0x56789
总共5字节, 即20位数据。
ok, 最后12位数据为真实的页偏移地址/序列号。
故拼接最终的物理地址, 0x56789678。
寻址成功。
转载地址:http://opcrj.baihongyu.com/