2010-10-05 153 views
4

虽然我目前对Internet Explorer地址空间感兴趣,但我不会介意一般的答案。问题是我如何计算一个Windows进程的地址空间(并且通过地址空间来表示内存中的最小和最大地址 - 如果我错了,则更正我)。 其实这个空间是固定还是变化的?我也知道虚拟地址空间或物理地址空间,如果我得到的是视觉图像,它对于我打开的每个IE实例都是一样的。 我确实有一个调试器(ollydbg是具体的),我想我可以从它得到一些信息,但我不能指定什么和如何。请承担我缺乏的知识,谢谢。Internet Explorer地址空间

+3

我怀疑你是不是在问你真正想问的问题。为什么你需要找到最小和最大的用户模式地址?您可以通过调用GetSystemInfo轻松完成此操作,但是您想实现什么目标?另外,“物理记忆”是什么意思?用户模式程序不直接处理物理内存。 – wj32 2010-10-05 07:58:13

+0

我不想这样做的原因是因为我想在地址空间中绘制一些信息。我不知道用户模式程序只处理虚拟内存。 所以我真正想得到的是Windows资源管理器(例如0x222ef到0xffffff)的地址空间的边界,以设置为我的轴的边界,并且这些地址对应于相同的内存段,以便我的测量具有含义。 – laertis 2010-10-05 09:23:47

+0

在任何情况下,“内存映射”窗口的“地址”列,而我调试(与ollydbg)回答我的问题? – laertis 2010-10-05 10:06:36

回答

2

正如wj32所评论的,用户模式应用程序仅处理虚拟内存。它们都被赋予相同的虚拟地址空间,通常大小约为2GB(可以另行配置,通常用于数据库服务器)。确切的地址可以使用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是正确的。用户模式应用程序只能看到虚拟内存。所以所有应用程序都有统一的地址空间。 OS和MMU(内存管理单元)会将虚拟内存地址转换为物理地址。如果物理地址没有被缓存在物理内存中,它将从硬盘中获取。

2
  1. 一般来说,Windows操作系统中的所有应用程序都使用虚拟内存。虚拟内存的功能很大程度上依赖于处理器方面的硬件支持。一旦启用此功能,处理器将根据内核定义的页表中的信息通过地址转换处理所有内存访问。但另一方面,我们可以声称Windows中的所有应用程序都与物理内存一起工作,因为处理器可以执行代码并仅在数据驻留在RAM中时处理数据,也称为物理内存。

    虚拟内存只是一个功能,允许在内存地址转换flrxible操纵。内核模式应用程序与用户模式应用程序的区别仅在于内核模式应用程序可以访问页表,并由此影响到内存访问地址转换为自然物理内存地址。相比之下,用户模式应用程序没有此权限,因为它会打破所有系统的可靠性和安全性。

  2. 按照视窗设计所有的应用进程(包括IE)共享相同的地址空间布局,其中:

    • 低虚拟地址的一些小部分被保留用于捕捉NULL指针废弃。尝试访问此区域将导致访问冲突错误。
    • 高地址的一部分大部分保留给内核模式代码。该区域不能从用户模式应用程序访问并由系统中的所有进程共享。
    • 部分在中间针对应用程序代码和数据。系统中的每个进程都有自己的该区域布局,隐式使用其自己的物理内存。

    如果在开始的小部分看起来像有一个64 Kb的常量大小。应用程序和内核地址空间部分之间的边界可以位于两个位置。第一个是广泛的默认边界,它将地址空间顶部的2Gb地址分配给内核。但是Windows内核可以通过特殊参数启动,将地址空间的内核部分的大小减小到1Gb。这种内核配置通常用在运行数据库的服务器上,因为bdatabase应用程序希望尽可能大的地址空间部分由于性能原因。

  3. 进程地址空间的应用程序部分的布局似乎相对稳定。它可以根据应用程序配置和应用程序活动稍微改变。对于Vista以前的所有Windows系统都是如此。从Windows Vista开始,Microsoft将应用ASLR(地址空间布局随机化)。该功能的用法是破坏上面描述的执行相同应用程序的所有进程的地址空间的相似性。由于安全原因应用此功能。

  4. 要获得已经被其他人所提到的进程的内存布局使用WinAPI的系统调用:

    • GetSystemInfo() - 要获得的 地址空间边界应用部分信息。
    • VirtualQueryEx() - 获取有关地址空间布局的一般信息。
    • WinAPI的其他功能可以根据类型获取有关地址空间区域的更多详细信息。请在MSDN中查询 的详细信息。