首页
论坛
专栏
课程

分享:
默认情况下,32位Windows操作系统的地址空间在4GB以内。Win32的平坦内存模式使每个进程拥有自己的虚拟空间。对32位进程来说,这个地址空间是4GB,因为32位指针可以拥有00000000h~FFFFFFFFh之间的任何一个值。此时,程序的代码和数据都放在同一地址空间中,即不必区分代码段和数据段。 虚拟内存(Virtual Memory)不是真正的内存,它通过映射(Map)的方法使可用的虚拟地址(Virtual Address)达到4GB,每个应用程序可以被分配2GB的虚拟地址,剩下的2GB留给操作系统自用。在Windows NT中,应用程序甚至可有3GB的虚拟地址。Windows是一个分时的多任务操作系统,CPU时间被分成一个个的时间片后分配给不同的程序。在一个时间片里,与这个程序执行无关的内容不会映射到线性地址中。因此,每个程序都有自己的4GB寻址空间,互不干扰。在物理内存中,操作系统和系统DLL代码需要供每个应用程序调用,所以在所有的时间必须映射。用户的EXE程序只在自己所属的时间片内被映射,而用户DLL则有选择地被映射。 简单地说,虚拟内存的实现方法和过程如下。 ① 当一个应用程序被启动时,操作系统就创建一个新进程,并给每个进程分配2GB的虚拟地址(不是内存,只是地址)。 ② 虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某个位置,并把当前所需要的代码读取到物理地址中(注意:虚拟地址与应用程序代码在物理内存中的位置是没有关系的)。 ③ 如果使用动态链接库DLL,DLL也会被映射到进程的虚拟地址空间中,在需要的时候才被读入物理内存中。 ④ 其他项目(例如数据、堆栈等)的空间是从物理内存中分配的,并被映射到虚拟地址空间中。 ⑤ 应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理位置。 看不明白上面的步骤也不要紧,但要明白以下几点。 + 应用程序是不会直接访问物理地址的。 + 虚拟内存管理器通过虚拟地址的访问请求来控制所有的物理地址访问。 + 每个应用程序都有相互独立的4GB寻址空间,不同应用程序的地址空间是隔离的。 + DLL程序没有自己的“私有”空间,它们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。因为如果它不和其他程序处于同一个地址空间,应用程序就无法调用它。 使用虚拟内存的好处是:简化了内存的管理,并可弥补物理内存的不足;可以防止多任务环境下各个应用程序之间的冲突。 64位Windows操作系统提供16TB的有效寻址空间,其中有一半可用于用户模式的应用程序。

上一篇 :
下一篇 :
讨论 (8)
fadax 2018-1-31
 举报
很赞的课程,如果再加点图片说明就更好了
NeilZ 2018-2-26
 举报
重温了很多知识~!  good。
未完 待续 2018-7-25
 举报
我应该先把《汇编语言》看完再说
陈jack 2018-7-31
 举报
学习一下
xianlai 2018-7-31
 举报
学习了...
借船摇摆 2018-9-3
 举报
谢谢老师的课程
啊浩 2019-1-11
 举报
长知识了。
bbgdlk 2019-1-18
 举报
又看到了Win32    进程就是4Gb
沪ICP备16048531号-1
沪公网安备 31011502006611号