首页
社区
课程
招聘
[原创]页表项(PTE)地址计算公式的解释
发表于: 2008-4-4 16:17 16906

[原创]页表项(PTE)地址计算公式的解释

2008-4-4 16:17
16906

 在《JIURL玩玩Win2k内存篇 分页机制 (三)》中提到计算虚拟地址对应PTE地址的公式,如下:

PTE_Addr = (VirtualAddr >> 12) * 4 + 0xC0000000
//为了缩短表达式,用VA表示虚拟地址
//           页目录索引                  页表索引
PTE_Addr=(([U]VA&0xffc00000)>>22[/U])*4096+(([U]VA&0x3ff000)>>12[/U])*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

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
看看。。。。
2008-4-4 17:26
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
hex太乱,最清楚的解释就是10:10:12
2008-4-4 18:10
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
4
学习了, 的确少写了个F,多谢,已经修正。
2008-4-4 21:11
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
5
本人在另一个地方看到下面这个方法也可以得到某一虚拟地址对应PTE的虚拟地址的,初看起来,还不知道那是什么意思的,实际上它和楼主所说的在本质上是一样的。下面的内容引自《Undocumented Windows NT》:

MOV EAX, ESI
AND EAX, 0xFFFFF3FF
SHR EAX, 0A
SUB EAX, 40000000

MOV EAX, ESI
AND EAX, FFCFFFFF
SHR EAX, 14
SUB EAX,3FD00000

当 ESI 寄存器的值为一个虚地址时,这两段代码分别取得页表项和页目录项。 实际中所用的寄存器可能不同,但模式是一样的。 许多于内存管理相关的代码中都会见到此类代码。起初看上去是有些别扭,但他们都是经过2的补码方法高度优化的。 作为练习,试着弄清楚它是如何工作的。提示:页表被映射的起始点在虚地址 0xC0000000,而页目录的则在 0xC0300000。

上面引号里的话是原文的,下面是凭本人的理解,对这段代码的解悉:
MOV EAX, ESI
AND EAX, 0xFFFFF3FF   
SHR EAX, 0A                 ;右移12位再左移2位,结果就是右移10位。
SUB EAX, 40000000     ;对EAX而言(不考虑标志位),减去0x40000000和加上0xC0000000是一样的,之后
                        ;EAX便是ESI对应的VA的页表的虚拟地址。

MOV EAX, ESI
AND EAX, FFCFFFFF
SHR EAX, 14                 ;右移12+10位再左移2位,结果就是右移20位。
SUB EAX,3FD00000      ;对EAX而言,减去0x3FD00000和加上0xC0300000是一样的

原文说,“当 ESI 寄存器的值为一个虚地址时,这两段代码分别取得页表项和页目录项。”我觉得应是当 ESI 寄存器的值为一个虚地址时,这两段代码分别取得页表项和页目录项的VA。我没看英文版的《Undocumented Windows NT》,不知是不是译错了。
2008-4-5 13:02
0
雪    币: 2559
活跃值: (176)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
“提示:页表被映射的起始点在虚地址 0xC0000000,而页目录的则在 0xC0300000。”
有点误人子弟的嫌疑!!!
2008-4-7 12:36
0
雪    币: 424
活跃值: (1879)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
啥意思????
2008-4-7 17:15
0
雪    币: 280
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
数学啊数学。
2008-4-9 08:38
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
9
引号里的这段话,是那本书的原文的。
2008-4-10 14:24
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
10
这个]“提示:页表被映射的起始点在虚地址 0xC0000000,而页目录的则在 0xC0300000。”据我了解,没问题吧。
如有误人子弟之处(虽然不是我误人子弟),请高手们指正,不胜感谢。
2008-4-10 14:51
0
雪    币: 2559
活跃值: (176)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
系统寻找进程的页表和页目录,只有CR3和指令的虚拟地址可用
2008-4-12 11:45
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不太明白下面几步的转换:
        =((VA&0xffc00000)>>10)+((VA&0x3ff000)>>10)+0xc0000000
        =((VA&0xffc00000)+(VA&0x3ff000)>>10)+0xc0000000
        =((VA&(0xffc00000|0x3ff000))>>10)+0xc0000000
2008-5-7 17:49
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
13
我想单从页表和页目录的角度来说,只要在里面填入合适的内容,系统可以把进程的页表和页目录映到任一线性地址。用调试器看时,可以看到

系统把页表和页目录映射到0xC0300000处了的。
上传的附件:
2008-6-1 22:52
0
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
14
“系统寻找进程的页表和页目录,只有CR3和指令的虚拟地址可用”

所以我想不只是只有CR3和指令的虚拟地址可用,从0xC0300000处拿来也可的。
2008-6-1 22:54
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
前人可真厉害啊
2008-6-4 17:40
0
游客
登录 | 注册 方可回帖
返回
//