虽然我目前对互联网资源管理器地址空间感兴趣但我不介意一般的答案。问题是如何计算一个窗口进程的地址空间(以及通过地址空间表示内存中的最小和最大地址 - 如果我错了,那就更正)。 实际上这个空间是固定还是变化?我也知道虚拟或物理地址空间,如果我得到的是视觉,那么我打开的每个IE实例的映射是否相同? 我确实有一个调试器(ollydbg是具体的),我想我可以从中获取一些信息,但我无法指定什么和如何。请承认我缺乏知识,谢谢。
答案 0 :(得分:2)
正如wj32评论的那样,用户模式应用程序只处理虚拟内存。它们都被赋予相同的虚拟地址空间,通常大小约为2GB(可以配置,否则,DB服务器通用)。可以使用GetSystemInfo
获取确切的地址。例如,在我的系统上,这就是我得到的:
Python 2.6.3
>>> import win32api
>>> win32api.GetSystemInfo()
(0, 4096, 65536, 2147418111, 3L, 2, 586, 65536, (6, 5898))
第3个和第4个结果值表示最小/最大内存地址,因此从用户模式的角度来看,所有进程的地址空间为65536-2147418111,大约为2GB。但是,我不认为这些信息会对您有所帮助。如果您要在流程的地址空间中查找具有特定属性的页面,则可以使用VirtualQueryEx
(如wj32再次注释)。 VirtualQueryEx
的行为允许您多次调用它,从进程最小地址开始并根据前一个调用结果递增,并获得目标进程内存空间的完整视图。
答案 1 :(得分:2)
一般来说,Windows操作系统中的所有应用程序都使用虚拟内存。虚拟内存的功能非常依赖于处理器端的硬件支持。一旦启用此功能,处理器将根据内核定义的页表中的信息通过地址转换处理所有内存访问。但另一方面,我们可以声称Windows中的所有应用程序都可以使用物理内存,因为处理器只有当它们驻留在RAM中时才能执行代码并处理数据,也称为物理内存。
虚拟内存只是一种允许对内存地址转换进行灵活操作的功能。内核模式应用程序与用户模式应用程序的不同之处仅在于内核模式应用程序可以访问页表,因此可以影响内存访问地址转换为自然物理内存地址。相比之下,用户模式应用程序没有这个权利,因为它会破坏所有系统的可靠性和安全性。
根据Windows设计,所有应用程序进程(包括IE)共享相同的地址空间布局,其中:
如果开始时的小部分看起来像是64 Kb的恒定大小。应用程序和地址空间的内核部分之间的边界可以驻留在两个位置。第一个是广泛的默认边界,它将地址空间顶部的2Gb地址分配给内核。但Windows内核可以使用特殊参数启动,将地址空间的内核部分的大小减小到1Gb。此内核配置通常用于运行数据库的服务器,因为bdatabase应用程序由于性能原因希望具有尽可能大的地址空间部分。
进程地址空间的应用程序部分的布局似乎相对稳定。它可以根据应用程序配置和应用程序活动稍微改变。对于Vista之前的所有Windows系统都是如此。从Windows Vista开始,Microsoft应用ASLR(地址空间布局随机化)。该特征的主旨是打破上面描述的执行相同应用程序的所有进程的地址空间的相似性。由于安全原因,此功能已应用。
要获得其他人WinAPI系统调用已经提到的进程内存布局:
GetSystemInfo()
- 获取有关应用程序部分的信息
地址空间边界。VirtualQueryEx()
- 获取有关地址空间布局的一般信息。答案 2 :(得分:0)
Yonilevy是对的。用户模式应用程序只能看到虚拟内存。所以所有应用程序都有统一的地址空间。 OS和MMU(内存管理单元)将虚拟内存地址转换为物理地址。如果物理地址没有缓存在物理内存中,它将从硬盘中获取。