总的来说,Windows操作系统中的所有应用程序都使用虚拟内存。虚拟内存是一种严重依赖于处理器硬件支持的功能。启用此功能后,处理器将根据内核定义的页表中的信息进行地址转换来处理所有内存访问。但另一方面,我们可以声称Windows中的所有应用程序都使用物理内存,因为只有当代码和数据驻留在RAM(也称为物理内存)中时,处理器才能执行代码并处理数据。
虚拟内存只是一种功能,允许对内存地址转换进行灵活操作。内核模式应用程序与用户模式应用程序的区别仅在于内核模式应用程序具有访问页表的权限,并且可以通过这种方式影响内存访问地址转换为自然物理内存地址。相反,用户模式应用程序没有这些权限,因为它会破坏系统的可靠性和安全性。
根据Windows的设计,所有应用程序进程(包括IE)共享相同的地址空间布局,其中:
- 一些低虚拟地址的小部分被保留用于捕获空指针解引用。尝试访问此区域将导致访问冲突错误。
- 高地址的一些巨大部分被保留用于内核模式代码。该区域无法从用户模式应用程序访问,并由系统中的所有进程共享。
- 中间部分针对应用程序代码和数据。系统中的每个进程都有自己的该区域布局,隐含地使用其自己的物理内存。
如果起始部分的小部分看起来具有恒定的64Kb大小。应用程序和内核地址空间之间的边界可以位于两个位置。第一个是广泛的默认边界,将2GB的地址分配给内核的地址空间顶部。但是,Windows内核可以使用特殊参数启动,将地址空间的内核部分大小减小到1GB。这种内核配置通常用于运行数据库的服务器上,因为数据库应用程序希望具有尽可能大的地址空间部分,以提高性能。
进程地址空间的应用程序部分的布局似乎相对稳定。它可能会根据应用程序配置和应用程序活动略微更改。对于Vista之前的所有Windows系统,这是正确的。从Windows Vista开始,Microsoft应用了ASLR(地址空间布局随机化)。该功能的目的是打破执行相同应用程序的所有进程的地址空间上述相似性。出于安全原因,应用了此功能。
要获取进程内存布局,请使用其他人提到的WinAPI系统调用:
- GetSystemInfo() - 获取有关应用程序部分地址空间边界的信息。
- VirtualQueryEx() - 获取有关地址空间布局的一般信息。
- WinAPI的其他功能,以根据其类型获取有关地址空间区域的更详细信息。请参阅MSDN以获取详细信息。