物理地址按照页来分配成很多不同的页,每个页有页号
有的页里存放的是页表,有的页里存放的是可以写的内存
每个页的大小是4KB,32位机器有2^32个地址
因此有2^32/2^21=2^20个页号,即2的20次方个虚拟页
物理地址也按照4K来分,但是物理地址一般没有4G大小
|*****4K*****| 第0项
|*****4K*****| 第1项
|*****4K*****| 第2项
|*****4K*****| 第3项
|*****4K*****| 第4项
...
......
ARM的虚拟地址和物理地址的转换
比如按照10 10 12来划分
10位 10位 12位
|0000000010| - |0000000010| - |00000000010|
| 2 | | 2 | | 2 |
按照划分,首先虚拟地址向右便宜22位的到,第一级(首级)页表项
为数值2.
然后根据全局唯一的地址,即首级页表的存放地址,这部分是连续的。
比如地址是第0XFF00 00FF
则可以得到第一级页表内存放的内容:
即读取0XFF00 00FF + 2*4k这个物理地址中的内容,其中分为12bit+20bit
后面20bit表示了第二级页表所在的物理页,为什么用20bit,因为一共有20bit
个物理页,比如得到的值是3,则这个第二级页表的的物理地址是4k*3,然后
看第二个10位,即二级页表的页内便宜,得到的是2,则可以得到第二级页表的
物理得只是4k*3 + 2,然后读取(4k * 3) + 2中的值,32位,其中20位表示了
第三级页表的物理地址,比如是0x0000 FF00,然后读取后12位的值,即2
则得到在第0x0000 ff00这个页表中的第2位,从而得到物理地址。
页表最多占用多少内存?
2^10个32位 2^10个32位 + 2^12个32位
即2^11 + 2^12 = 2kb + 4kb = 6kb
如果不采用2级页表的话
那么有2^20次方个页表项,需要2^20次方个32位,即2^10kb=2MB
2MB也不是很大,可是在linux下,每个进程有自己的独立页表,
那每个进程一上来就分配2MB,这样的开销很大。
因此多级页表,主要是灵活,而且节省空间,每个32bit中有12bit的状态位
表示了页表的各种状态。
阅读(510) | 评论(0) | 转发(0) |