历程地址空间详解

进程地址空间详解
进程地址空间详解

 

内存管理器每个进程(例如Windows Explorer、记事本和Word)指派一部分物理内存

堆,进程创建时,在进程空间建立的区域,由堆管理器来管理。进程可以有多个堆。有一个默认堆为1M,可扩大。

通过命令,改变其大小:
#pragma comment(linker,"/HEAP:102400000,1024000")
###########################################################

虚拟地址:非实际物理地址的位置(进程)。系统为每个进程维护着一个页面映射,将虚拟地址转换为相应的物理地址。

Windows NT 4.0 SP3 Server Enterprise Edition, Windows 2000 Advanced Server, and Windows .NET Enterprise Server:一般的,进程能够使用低端的3GB空间(0x00000000 到 0xBFFFFFFF)。高端的1GB内存(0xC0000000 到 0xFFFFFFFF)为系统保留部分
Windows NT/2000/XP: 进程能够使用低端的2GB内存(0x00000000 到 0x7FFFFFFF),高端的2GB内存(0x80000000 到 0xFFFFFFFF)系统保留。
Windows 95/98/Me:
区间                                                                用途
0K - ~64K (0xFFFF) 不可写       为系统装载MS-DOS而保留。           进程私有。


~64K (0x10000) - 4 MB (0x3FFFFF)   为兼容MS-DOS保留进程可读可写。进程私有。


4MB (0x400000) - 2GB (0x7FFFFFFF) 用于代码和用户数据用户数据可读可写进程私有


2GB (0x80000000) - 3GB (0xBFFFFFFF) 共享区。对所有进程可读写动态连接库等装载到这区域。


3GB (0xC0000000) - 4GB (0xFFFFFFFF) 系统内存。对所有进程可读写。然而,需要注意的是,这段内存是保存低等级的系统代码的地方,所以,向这片区域写入数据可能会破坏系统可能造成灾难性后果。.

############################################################

32Windows计算机上,进程具有4GB的虚拟内存地址空间,操作系统通常会把这4GB的地址空间划分为进程和系统两个部分。

1.   每一个应用程序都拥有相互独立的 4GB 地址空间。

2.   倒不是说它们都拥有 4GB 的物理地址空间,而只是说能够在 4GB 的范围内寻址。操作系统将会在应用程序运行时完成 4GB 的虚拟地址和物理内存地址间的转换。

3. 如果,所有的应用程序都运行于同一个 4GB 地址空间,它们可以彼此"看"到别的程序的内容,这极易导致一个应用程序破坏(//write)另一个应用程序操作系统数据或代码

地址空间!=内存:

    严格来说,地址空间和内存是不同概念,地址空间是CPU所能管理内存的范围,4GB地址空间不表示4GB内存。按32位Windows来说,虚拟地址空间是4GB,虚拟内存的最大值是4GB(实际不会达到最大值),并不是一开始就有4GB,而是要通过系统来“分配”之后才有的。进程地址空间也是4GB,前2GB是用户地址空间,是每个进程独立的;后2GB是系统地址空间,是各个进程共享的。所谓“共享”是指这段空间属于每个进程,而不是不属于任何进程,在内核中同样是要区分进程的。

################################################################

进程空间与虚拟地址

   进程地址空间的地址都是虚拟地址,即理论上是可以从0x00000000~0xFFFFFFFF.

为什么称为虚拟?

1. 虚拟内存指:不是内存,但可以当成内存用。

2.   发生情况:程序需要很多内存来存储数据,而你的机器没有这么多内存,这时候操作系统通过文件虚拟内存来帮你,这就是虚拟内存。进程地址空间理论上,在32位操作系统上为4G,实际上,你的内存可能没有那么多,至少现在的机器,一般是128,256,512M的内存没有4G内存,这时候,虚拟内存可以帮你访问其他的地址空间。

虚拟地址会不会重叠?

1.   每个进程的地址空间都是固定并且相同的。

2.    如果没有虚拟内存,这显然是不合乎逻辑的,因为每个内存地址都只能使用一次,不能重叠。所以引入了虚拟内存机制。进程地址空间是逻辑上的而不是物理上的。内存映射机制负责把这个逻辑上的地址映射到实际的内存或页面文件上。 "加载可执行文件到地址空间"实际上主要就是逻辑地址到物理内存的映射过程。

########################################################################