Internet Explorer地址空间

4
尽管我目前对Internet Explorer地址空间很感兴趣,但我不介意得到一个通用答案。问题是如何计算Windows进程的地址空间(通过地址空间,我的意思是内存中的最小和最大地址-如果我错了,请纠正我)。实际上,这个空间是固定的还是可变的?我能知道虚拟地址空间还是物理地址空间,如果我得到的是视觉地址空间,那么我打开的每个IE实例的映射是否相同?我有一个调试器(具体来说是ollydbg),我想我可以从中获取一些信息,但我无法指定什么以及如何。请原谅我的知识匮乏,谢谢。

3
我怀疑你并没有问出你真正想问的问题。你为什么需要查找最小和最大的用户模式地址?你可以通过调用 GetSystemInfo 来轻松实现这一点,但你试图达到什么目的?此外,“物理内存”是什么意思?用户模式程序不直接处理物理内存。 - wj32
我想这么做的原因是因为我想在地址空间中绘制一些信息。我不知道用户模式程序只处理虚拟内存。 所以我真正想要的是获取Windows资源管理器的地址空间边界(例如0x222ef到0xffffff)并将其设置为我的坐标轴的边界,同时这些地址对应于相同的内存段,以便我的测量结果具有意义。 - laertis
无论如何,在我使用ollydbg调试时,“Memory Map”窗格的“Address”列是否可以回答我的问题? - laertis
2
使用VirtualQueryEx循环遍历内存区域。(抱歉,没时间发布完整答案。) - wj32
@laertis:你是想要类似于RAMMap这样的东西吗? - Deanna
你打算如何处理你的图表?通常情况下,应用程序不应该窥探彼此。 - Raymond Chen
3个回答

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

2

正如wj32所评论的那样,用户模式应用程序只处理虚拟内存。它们都被分配了相同的虚拟地址空间,通常大小约为2GB(可以配置为其他值,对于DB服务器来说很常见)。可以使用GetSystemInfo获取确切的地址。例如,在我的系统上,我得到的结果如下:

Python 2.6.3
>>> import win32api
>>> win32api.GetSystemInfo()
(0, 4096, 65536, 2147418111, 3L, 2, 586, 65536, (6, 5898))

第三和第四个结果值表示最小/最大内存地址,因此从用户模式的角度来看,所有进程都将其地址空间视为65536-2147418111,大约2GB。然而,我认为这些信息对您并没有太大帮助。如果您正在查找进程地址空间中具有特定属性的页面,则可以使用VirtualQueryEx(如wj32再次评论所述)。VirtualQueryEx的行为允许您多次调用它,从进程最小地址开始并根据前一个调用结果递增,并获得目标进程内存空间的完整视图。

0
Yonilevy是正确的。用户模式应用程序只能看到虚拟内存。因此,所有应用程序都具有统一的地址空间。操作系统和MMU(内存管理单元)将虚拟内存地址转换为物理地址。如果物理地址未被缓存在物理内存中,则会从硬盘中获取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接