地址转换总述
根据KProcess中的Cr3中保存的页目录基址,可以找到页目录起始地址,再根据页目录索引找到PDE(Page Directory Entry)中的PFN(Page Frame Number,页面帧编号),进而找到所对应页表,结合页表索引,找到页表项(PTE),进而找到目标内存页,再结合字节索引,就能找到物理内存地址空间;
虚拟地址转换物理地址(关闭PAE)
首先在被调试的系统中,写了一个程序,并获得了打印的字符串的地址:12ff3c
开始双机调试
首先调换进程环境到被调试的进程
!process 0 0
使用这个命令列出当前所有的进程
PROCESS 85041d40 SessionId: 1 Cid: 0ed0 Peb: 7ffd3000 ParentCid: 070c DirBase: 11997000 ObjectTable: afe35b40 HandleCount: 13
Image: SwitchAddrOffset.exe
Process 就是这个进程的加载基址
DirBase :是CR3,也就是页目录的基址
使用命令切换到这个进程 :
.process/i xxx程序加载基址
然后点 g 一下,让系统断下来
然后找到页目录表,也就是DirBase(CR3寄存器)中保存的值
!dd xxx地址
!
表示使用的是物理地址,因为进程已经创建 ,页表已经映射到物理地址中 ;
虚拟地址提前按照10 ,10,12位 分开
12ff3c 按照10,10,12分开之后为:00,12f,f3c
说明00 是页目录的索引,也就是第一个地址 :这里地址是 11d98867
因为这个地址的前12项(前12位)保存的是页表的属性等信息,所以实际的地址应该是:11d9800(后面20位) 、
上面这一段话可以结合下面这幅图来理解:
这个地址是页表的首地址,然后页表的索引是12f,因此可以找到这个地方,从而获得实际的物理地址 :
!dd 11d98000+4*12f
得到的地址是:212e0867,
同样的,后面的12个位是属性等信息,所以实际的物理是:212e000 ,
物理地址加上偏移,就是实际物理地址212e000 + f3c;
PAE模式
PAE模式相对于传统模式多了一个PDPTE,PAE模式下的PDE与PTE都变成了8个字节;
控制寄存器
cpu中有一组控制寄存器 ,用于控制和确定CPU的操作模式
Cr0 | Cr1 | Cr2 | Cr3 | Cr4 |
---|
其中:Cr1 保留 ;Cr3 是叶目录基址
Cr0寄存器,页保护
PE(Protect Table):
1.当CR0 的位 0是启动保护标志位;
2.PE=1 保护模式,PE=0,实地址模式,这个标志位仅开启段级保护,而没有启动分页机制 ;
3.若要启动分页机制,那么PE的PG标志都要置位
PG:当设置改位时立即开启了分页机制。在开启这个标志位之前必须已经或者同时开启PE标志
PG | PE | 处理器工作模式 |
---|---|---|
0 | 0 | 实地址模式 |
0 | 1 | 在没有开启分页机制的保护模式下(没有这种操作系统 |
1 | 0 | PE没有开启,PG无法开启,因此也不存在这种情况 |
1 | 1 | 在开启了分页机制的保护模式下 |
Cr2寄存器
当cpu 访问某个无效页面的时候,会产生缺页异常,此时,CPU会将引起异常的线性地址存放在CR2中
Cr4寄存器
PAE/PSE说明 :
PAE=1 是PAE分页;
PAE =0 是普通分页;
MSR寄存器(特殊模块寄存器)
每一个MSR寄存器都有它的编号;
可以使用下面的指令进行读写(特权权限指令):
rdmsr:ecx存放序列号,执行完之后数据放在eax中;
wrmsr:ecx存放序列号,eax存放数据,执行完后将eax写入到相应寄存器中