页表项(PTE)地址计算公式的解释
来源:互联网 发布:ipython for windows 编辑:程序博客网 时间:2024/05/18 02:45
转自: http://www.pediy.com/kssd/pediy10/62497.html
在《JIURL玩玩Win2k内存篇 分页机制 (三)》中提到计算虚拟地址对应PTE地址的公式,如下:
代码:
PTE_Addr = (VirtualAddr >> 12) * 4 + 0xC0000000
其实很简单,因为1024个页表被映射在0xC0000000 - 0xC03FFFFF地址中,暂且不理会页目录被映射到哪,只要知道页目录里的1024个页目录项分别指向0xC0000000 - 0xC03FFFFF地址中的1024个页表就行了(其实这是因为页目录和一个页表完全重合的原因,见《JIURL玩玩Win2k内存篇 分页机制 (四)》),这样就可以得到一个关系,页目录索引n指向的页表就等于0xC0000000 + n * 页表大小,一个页表的大小是1024 * 4 = 4096 = 2的12次方,得到了页表,在加上页表索引就可以得到页表项(PTE)的地址了,用公式表示就是如下:
代码:
//为了缩短表达式,用VA表示虚拟地址// 页目录索引 页表索引PTE_Addr=((VA&0xffc00000)>>22)*4096+((VA&0x3ff000)>>12)*4+0xc0000000 =(((VA&0xffc00000)>>22)<<12)+(((VA&0x3ff000)>>12)<<2)+0xc0000000 =((VA&0xffc00000)>>10)+((VA&0x3ff000)>>10)+0xc0000000 =((VA&0xffc00000)+(VA&0x3ff000)>>10)+0xc0000000 =((VA&(0xffc00000|0x3ff000))>>10)+0xc0000000 =((VA&0xfffff000)>>10)+0xc0000000 =(((VA&0xfffff000)>>12)<<2)+0xc0000000 =((VA&0xfffff000)>>12)*4+0xc0000000
代码:
PTE_Addr = (VirtualAddr >> 12) * 4 + 0xC0000000
代码:
PTE = ((VA >> 12) << 2 ) & 0x3FFFC + 0xc0000000;
代码:
PTE = ((VA >> 12) << 2 ) & 0x3FFFFC + 0xc0000000;
代码:
PTE = (VA >> 12) * 4 + 0xc0000000;
上面说的都是在32位 x86 非PAE的情况下,PAE情况下略有不同,有时间再整理
0 0
- 页表项(PTE)地址计算公式的解释
- 页表项(PTE)地址计算公式的解释
- 计算子网地址和广播地址的简单公式
- STM32位带操作(bit_band)位带区字节的位所对应的位带别名区地址计算公式的解释
- 纯天然 FAT1表的偏移地址计算公式
- [原创]我写的一个观察系统进程特定虚拟地址页PTE的工具
- SQLSERVER的公式计算
- 人月的计算公式
- D3DTOP_DOTPRODUCT3的计算公式
- PI的计算公式
- 计算器的公式计算
- 上证指数的计算公式
- 圆周率的计算公式
- 日期的计算公式
- 四元数的计算公式
- 3.windbg-!pte转换地址(ring0)
- PAE模式下如何计算PTE
- 公式解释
- 52_三击事件
- ACM 简单DP Pole Arrangement Regionals 2012 >> Asia - Daejeon 区域赛
- Hadoop权威指南 第三章笔记
- Android应用程序永久获取root权限方法
- Web Service报错 求解
- 页表项(PTE)地址计算公式的解释
- hdu 1085 Holding Bin-Laden Captive!(母函数)
- LinuxIO模型概述
- j2ee面试题
- tomcat配置问题
- 线索二叉树
- 具有增删改 O(1)复杂度的和查找O(lg)复杂度的特定容器--用于特定特征的数据
- 查看当前堆栈调用信息
- 判断IDE运行 DebugHook