虚拟地址转物理地址
来源:互联网 发布:js的math.abs 编辑:程序博客网 时间:2024/06/05 16:03
默认情况下,windows xp以上都开启了pae(physical address extend),所以本文主要讲开启了pae之后的从虚拟地址到物理地址的转换。
我们知道,一个32位的计算机,假设每个字节的数指向一个内存地址,那么2^32=2^2*2^30=4*G;也就是说,如果不开启物理地址扩展,最多只能有4G的内存大小,但是我们都知道,即使是32的计算机他的内存也不止扩展到4G,解决办法是通过pae。
pae需要记住以下名词,
页目录指针表的索引(找页目录首地址)
页目录表的索引(找页表首地址)
页表索引(找页首地址)
页内偏移(找目标地址)
可以理解为找一行字的过程,
相对应是
书架
书
页
行
接下来解释pae的用法
PAE将一个32位的数分为如上四段.2+9+9+12=32,cr3是页目录指针表基址。
(通过这种方法最多可以有2^20个页,每个页的大小为4kByte。)
假设我们要查看的虚拟地址是0x17823966,通过windbg查看进程的dirbase即页目录指针表基址为0x12345678(随便一点的好),
假设是他的显示是这样的
地址 数据
0x12345678 0x25685428 0x35789615 0x15789635 0x32458916
我们首先将0x17823966转换为二进制 0001 0111 1000 0010 0011 1001 0110 0110
按图中划分 00 01 0111100 0 0010 0011 1001 0110 0110
指针表索引 页目录表索引 页表索引 页内偏移
0 188 35 2406
然后前两位是00所以就是0x12345678+0,也就是数据0x25685428,因此0x25685000就是页目录基址,通过
25685000+188*8得到页目录地址=25685ee0
定位25685ee0
假设如下所示
地址 数据
0x25685ee0 0x12573596 0x00000000 0x00000000 0x00000000
那么0x12570000就是页表基址,通过页表基址找到页表也是用同样的方法,
0x12570000+35*8得到页表0x12570118
通过页表加偏移,就是物理地址了。
0x12570118+2406=0x12570A7E(物理地址)
0x12570A7E
- 虚拟地址转物理地址
- 内核虚拟地址转物理地址的函数
- 虚拟地址--物理地址
- 物理地址和虚拟地址
- 物理地址与虚拟地址
- 物理地址 虚拟地址
- 物理地址 虚拟地址
- 虚拟地址转为物理地址
- 物理地址与虚拟地址
- 物理地址 虚拟地址
- 物理地址和虚拟地址
- 物理地址和虚拟地址
- 物理地址与虚拟地址
- Linux虚拟地址->物理地址
- 虚拟地址和物理地址
- 物理地址与虚拟地址
- 物理地址以及虚拟地址
- 物理地址与虚拟地址
- iOS UIFont详解
- SDUT 1263 自然数的拆分
- Android 反射、代理调用系统隐藏API方法与接口类连接Wi-Fi
- 图像增广
- 数据库建立索引的优缺点
- 虚拟地址转物理地址
- (python3)1026. 程序运行时间(15分)及1027. 打印沙漏(20分)
- WWDG—窗口看门狗
- 日期类Calendar
- 详细解析WSAAsyncSelect模型
- leetcode 488. Zuma Game 祖玛游戏 + 递归做法
- 让DIV中的DIV居中显示
- 右键的 在 vs 中打开 怎么去掉
- *** Your GCC is older than 6.0 and is not supported ubuntu update gcc-6.1