虚拟地址转物理地址

Posted MyArt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟地址转物理地址相关的知识,希望对你有一定的参考价值。

参考资料:
《X64结构体系内存寻址》
《x86 系列 CPU 内存寻址模式总结》
最好的两篇,对各个位都讲的很清楚, 刚开始容易陷入其中,整整看了两天,最后才发现主要框架, 查细节很有用。
win7 x64位,4级索引,看了两天,最后发现虚拟地址实现就是 4个数组坐标, 到物理地址就索引了4次数组, 或者是   [ [  [   [  [dirBae] ] + 0x8] + 0x8f*8] + 0xd90]
 测试程序代码如下:
  1. #include "stdafx.h"
  2. #include <Windows.h>
  3. int _tmain(int argc, _TCHAR* argv[])
  4. {
  5. char szName[20] = "HelloWorld";
  6. printf("szName:%x\\n",szName);
  7. getchar();
  8. }



 
!process 0 0

 上面显示 "hello world" 的虚拟地址, .formats 如下:

 
64位地址,高16位为符号位,底48位用于地址, 根据下图分割如下:

 
      16位符号位           9                9                 9                 9                 12位页内寻址
00000000 00000000 00000000 00000000 00000000 00101000 11111101 10010000
                                   pml4e=0    pdpte=0     pde=1        pte=8f         页内偏移=d90
开始索引, 实际虚拟地址就是存了4个数组坐标,和一个偏移

 
 
 






以上是关于虚拟地址转物理地址的主要内容,如果未能解决你的问题,请参考以下文章

Linux驱动虚拟地址和物理地址的映射(转)

转: PE rva to raw 虚拟偏移地址和文件物理偏移地址

虚拟地址转物理地址

手动玩转虚拟地址到物理地址转化

手动玩转虚拟地址到物理地址转化

Windows虚拟地址转物理地址(原理+源码实现,附简单小工具)