【问题标题】:Internet Explorer Address SpaceInternet Explorer 地址空间
【发布时间】:2011-04-21 04:11:28
【问题描述】:

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

【问题讨论】:

  • 我怀疑你没有问你真正想问的问题。为什么需要找到最小和最大用户模式地址?您可以通过调用 GetSystemInfo 轻松完成此操作,但您想要实现什么?另外,“物理内存”是什么意思?用户模式程序不直接处理物理内存。
  • 我不想这样做的原因是因为我想在地址空间中绘制一些信息。我不知道用户模式程序只处理虚拟内存。所以我真正想要得到的是 Windows 资源管理器的地址空间的边界(例如 0x222ef 到 0xffffff )设置为我的轴的边界,并且这些地址对应于相同的内存段,以便我的测量有意义.
  • 在我调试(使用 ollydbg)时,“内存映射”窗口窗格的“地址”列是否会回答我的问题?
  • 使用 VirtualQueryEx 循环访问内存区域。 (抱歉,没有时间发布完整的答案。)
  • @laertis:你在追求RAMMap这样的东西吗?

标签: c windows winapi internet-explorer memory


【解决方案1】:
  1. 一般来说,Windows 操作系统中的所有应用程序都使用虚拟内存。虚拟内存是严重依赖处理器端硬件支持的功能。一旦启用此功能,处理器将根据内核定义的页表中的信息通过地址转换处理所有内存访问。但另一方面,我们可以说 Windows 中的所有应用程序都使用物理内存,因为处理器只有在内存(也称为物理内存)中才能执行代码并处理数据。

    虚拟内存只是一种允许对内存地址转换进行灵活操作的功能。内核模式应用程序与用户模式应用程序的不同之处仅在于内核模式应用程序可以访问页表,并且由此可以影响将内存访问地址转换为自然物理内存地址。相比之下,用户模式应用程序则没有这个权限,因为它会破坏所有系统的可靠性和安全性。

  2. 根据 Windows 设计,所有应用程序进程(包括 IE)共享相同的地址空间布局,其中:

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

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

  3. 进程地址空间的Application部分的布局似乎比较稳定。它可能会根据应用程序配置和应用程序活动而略有变化。这适用于直到 Vista 的所有 Windows 系统。从 Windows Vista 开始,Microsoft 应用了 ASLR(地址空间布局随机化)。该功能的目的是打破上述执行同一应用程序的所有进程的地址空间的相似性。出于安全原因应用此功能。

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

    • GetSystemInfo() - 获取有关应用程序部分的信息 地址空间边界。
    • VirtualQueryEx() - 获取有关地址空间布局的一般信息。
    • WinAPI 的其他函数可根据其类型获取有关地址空间区域的更多详细信息。在 MSDN 中查找 详情。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      正如 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的行为让你可以多次调用它,从进程最小地址开始,根据之前的调用结果递增,得到目标进程内存空间的完整视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 2019-11-06
        • 1970-01-01
        • 2012-08-16
        相关资源
        最近更新 更多