物理地址与虚拟地址怎么转换
MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址、硬件地址,用来定义网络设备的位置。今天学习啦小编给大家介绍一下物理地址虚拟地址转换。供大家参考!
物理地址虚拟地址转换参考如下
物理地址按照页来分配成很多不同的页,每个页有页号
有的页里存放的是页表,有的页里存放的是可以写的内存
每个页的大小是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的状态位
表示了页表的各种状态。
已知一个虚拟地址0x01AF5518, 则转换的过程如下:
注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况*
1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:
-> 0000 0001 1010 1111 0101 0101 0001 1000
按照10, 10, 12的位数重新排列后
-> (页目录索引)00 000 00110, (页表项索引)10 1111 0101, (偏移)0101 0001 1000
换算成十六进制后可以得到如下结果
页目录索引 = 6, 页表项索引 = 0x2f5 , 偏移 = 0x518
2. 根据当前的CR3寄存器中的物理地址定位页目录表基址
Cr3中存放的是物理地址, 这个物理地址指向进程的页目录表基址, 由此可以得到
页目录表基址(PDE) = Cr3 = 0xAA0E5000
3. 计算页表项的地址
页表地址存放在页目录表(PDE)中的第6个项目中, 也就是
[0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867为该页表属性值, PTE = 0x3D955000
3. 计算页面物理地址
我们要找的页面在这个页表中的第0x2f5项, 所以虚拟地址所在的页的物理地址为
[0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =
假设[0x3D955BD4] = 0x7095e847, 页面的物理地址 x0x7095e000, 0x00000847表示的是页面属性
4. 计算最终的物理地址
由虚拟地址分离的偏移可以计算出最终的物理地址为
0x7095E000 + 0x00000518 = 0x7095E518.
学习啦小编介绍了物理地址虚拟地址转换的相关知识,希望你喜欢。