由于Windows程序时运行在386保护模式下,这样程序访问 存储器所使用的 逻辑地址称为虚拟地址,与实地址模式下的分段地址类似,虚拟地址也可以写为“段: 偏移量”的形式,这里的段是指段选择器。 Windows 2000 使用基于 分页机制的 虚拟内存。每个进程有4GB的虚拟 地址空间。基于 分页机制,这4GB 地址空间的一些部分被映射了 物理内存,一些部分映射硬盘上的交换文件,一些部分什么也没有映射。程序中使用的都是4GB 地址空间中的虚拟地址。而访问 物理内存,需要使用 物理地址。下面我们看看什么是 物理地址,什么是虚拟地址。 物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的 物理内存中的数据放到 数据总线中传输。如果是写,电路根据这个地址每位的值就在相应地址的 物理内存中放入 数据总线上的内容。 物理内存是以 字节(8位)为单位 编址的。 虚拟地址 (virtual address): CPU启动 保护模式后,程序运行在虚拟 地址空间中。注意,并不是所有的“程序”都是运行在虚拟地址中。CPU在启动的时候是运行在实模式的,Bootloader以及内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。 如果CPU寄存器中的分页标志位被设置,那么执行内存操作的 机器指令时,CPU(准确来说,是 MMU,即Memory Management Unit,内存管理单元)会自动根据页目录和 页表中的信息,把虚拟 地址转换成物理地址,完成该指令。 比如 mov eax,004227b8h ,这是把地址004227b8h处的值赋给寄存器的汇编代码,004227b8这个地址就是虚拟址。CPU在执行这行代码时,发现寄存器中的分页标志位已经被设定,就自动完成虚拟地址到 物理地址的转换,使用物理地址取出值,完成指令。