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

时间:2010-04-19 11:51:22

标签: c++ windows memory-management

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

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

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

第二个问题是最大的问题,我认为这与PTE的最大数量有关(页表条目,它存储有关虚拟内存如何映射到物理内存的信息,以及页面是否应该是只读的你可以拥有一个过程。

我的问题(或提示小心):

  • 我在哪里可以找到有关过程中最大PTE数量的信息?
  • 对于64位系统/应用程序是否有所不同(更高)?
  • 可以在应用程序中还是在Windows中配置PTE的数量?

谢谢,

帕特里克

PS。请注意那些试图证明你不应该编写自己的内存管理器的人:

  • 我的应用程序非常具体,所以我真的希望完全控制内存管理(无法提供更多详细信息)
  • 上周我们有一个内存覆盖,我们用标准C ++分配器和C / C ++运行时的调试功能找不到它(它只是在实际损坏后说“阻止损坏”分钟“)
  • 我们还尝试过标准的Windows实用程序(如GFLAGS,......),但是它们将应用程序放慢了100倍,无法找到覆盖的确切位置
  • 我们还尝试了Application Verifier的“Full Page Heap”功能,但是应用程序也没有启动(可能也用完了PTE)

4 个答案:

答案 0 :(得分:3)

我认为Mark Russinovich在technet上发布了一系列伟大的博客文章,名为“推动Windows的极限......”

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

它有一些关于虚拟内存,分页非分页内存,物理内存等的文章。

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

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

答案 1 :(得分:1)

  

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

这已经完成了。 Application VerifierPageHeap

可以在Windows Internals, 5th Ed.Intel Manuals中找到有关PTE和内存架构的信息。

  

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

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

  

我在哪里可以找到有关的信息   一个过程中的最大PTE数量?

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

在32位Windows上为2GB,在x64 Windows上为更大。 (实际数字有所不同,但它“足够大”)。

  问题是虽然我已经足够了   内存,应用程序永远不会启动   完全因为它耗尽了   存储器中。

你是a)泄漏记忆吗? b)使用非常低效的算法?

答案 2 :(得分:1)

看看OpenBSD malloc的实施情况。很多相同的想法(以及更多)由非常技术人员实施。

答案 3 :(得分:1)

霰弹枪的方法是随机分配那些孤立的4KB条目 。这意味着您需要重复运行相同的测试,并重复输入相同的输入。如果你幸运的话,有时它会发现错误。

一种稍微聪明的方法是使用另一种算法而不仅仅是随机算法 - 例如使它依赖于调用堆栈是否隔离了分配。例如,您是否信任std::string用户并怀疑原始malloc使用?