大家可能都听说过,每个程序在运行时,操作系统都会为其分配一段4GB的内存空间。
但是我们的内存容量很可能最多只够为一个进程分配4GB的内存空间,如何做到为每个进程都分配呢?
实际上,进程被分配到的“4GB内存空间”只是虚拟的的内存空间,并不是指真正意义上的物理内存,虚拟内存与物理内存之间有一层转换关系。
先看如下指令:
MOV eax,dword ptr ds:[0x12345678]
其中,0x12345678 是有效地址
ds.Base + 0x12345678 是线性地址
注意:当段寄存器的Base为0时,有效地址=线性地址,大多数时候都是如此;但也有特殊情况,比如fs段寄存器的Base不为0
描述:
我们平时所用到的系统DLL(动态链接库)存在于物理地址中,当程序想要调用某个DLL时,DLL便会映射一份线性地址给程序,这样程序就能够通过线性地址找到DLL的物理地址
描述:
每个进程都有一个Cr3(准确的说是都有一个Cr3的值,Cr3本身是个寄存器,一个核,只有一套寄存器)
Cr3指向一个物理页,一共4096字节
有关Cr3结构部分将在下一篇详细说明,这里只引入基本概念(实验需要)
右键→我的电脑→属性→高级
可以看到左边出现了两个结果,我们可以在记事本中将最后的字符’d’改成’m’来确认哪个才是真正的线性地址
06765140
0 6 7 6 5 140
=
0000 0110 0111 0110 0101 140
=
0000011001// 0x19
1101100101// 0x365
140// 12个比特位刚好三个字节
在WinDbg中输入命令:!process 0 0
注意:
联系客服