学习啦>学习电脑>网络知识>网络基础知识>

物理地址与虚拟地址怎么转换

春健分享

  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.

  学习啦小编介绍了物理地址虚拟地址转换的相关知识,希望你喜欢。

    579981