代码之家  ›  专栏  ›  技术社区  ›  Patrick

有关Windows中PTE(页表条目)的信息

  •  2
  • Patrick  · 技术社区  · 15 年前

    为了更容易找到缓冲区溢出,我正在更改我们的自定义内存分配器,以便它分配一个完整的4KB页,而不是只分配所需的字节数。然后我更改页面保护和大小,这样如果调用者在分配的内存之前或之后写入,应用程序就会立即崩溃。

    问题是,虽然我有足够的内存,但应用程序永远不会完全启动,因为它耗尽了内存。这有两个原因:

    • 由于每个分配都需要4KB,我们很快就可能达到2GB的限制。如果我要使一个64位的可执行文件(还没有尝试它)可以解决这个问题。
    • 即使我只需要几百兆字节,分配也会在某个时刻失败。

    第二个问题是最大的问题,我认为它与您在一个进程中可以拥有的最大数量的pte(页表条目,它存储关于虚拟内存如何映射到物理内存以及页是否应为只读的信息)有关。

    我的问题(或为小费而哭泣):

    • 在哪里可以找到有关进程中最大PTE数的信息?
    • 对于64位系统/应用程序,这是否不同(更高)?
    • 可以在应用程序或Windows中配置PTE的数目吗?

    谢谢,

    帕特里克

    注意:对于那些试图争辩不应该编写自己的内存管理器的人:

    • 我的应用程序相当具体,所以我真的想完全控制内存管理(不能提供更多细节)
    • 上周我们使用了一个内存重写,我们无法使用标准的C++分配器和C/C++运行时的调试功能来查找它(它只说“块在实际的损坏之后的分钟”损坏了)。
    • 我们还尝试了标准的Windows实用程序(如gflags,…),但是它们将应用程序的速度降低了100倍,并且也找不到覆盖的确切位置。
    • 我们还尝试了应用程序验证器的“整页堆”功能,但是应用程序也没有启动(可能也会耗尽pte的功能)。
    4 回复  |  直到 15 年前
        1
  •  1
  •   MSalters    15 年前

    散弹枪方法是分配那些独立的4KB条目 随意地 . 这意味着您需要用相同的输入重复地重新运行相同的测试。如果你幸运的话,有时它会捕捉到错误。

    一个稍微聪明一点的方法是使用另一种算法,而不仅仅是随机的——例如,让它依赖于调用堆栈,不管分配是独立的。你相信吗? std::string 例如,用户和可疑原始用户 malloc 使用?

        2
  •  3
  •   JB.    15 年前

    我认为TechNet上MarkRussinovich的一系列博文叫做“推Windows的极限…”

    http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx

    它有一些关于虚拟内存、分页非分页内存、物理内存和其他方面的文章。

    他提到了一些他用来测量系统资源的实用程序。

    希望你能在那里找到答案。

        3
  •  1
  •   Nikolai Fetissov    15 年前

    看看 OpenBSD malloc . 许多相同的想法(以及更多)是由 非常 技术娴熟的民族

        4
  •  1
  •   Alex Budovski    15 年前

    为了更容易找到缓冲区 溢出我正在改变我们的习惯 内存分配器,以便它分配 一个完整的4KB页面,而不仅仅是 需要的字节数。

    这已经完成了。 Application Verifier 具有 PageHeap .

    有关PTE和内存结构的信息,请参见 Windows Internals, 5th Ed. 以及 Intel Manuals .

    对于64位系统/应用程序,这是否不同(更高)?

    当然。64位Windows有更大的地址空间,因此很明显需要更多的PTE来映射它。

    在哪能找到 进程中PTE的最大数目?

    这不像进程中可用的最大用户地址空间量那么重要。(PTE的数量是这个数字除以页面大小。)

    这在32位窗口上是2GB,在x64窗口上要大得多。(实际数字各不相同,但“足够大”)。

    问题是尽管我有足够的钱 内存,应用程序从不启动 完全上升,因为它用完了 记忆。

    你是在泄露记忆吗?b)使用效率极低的算法?