【问题标题】:windows memory managment: check if a page is in memorywindows内存管理:检查页面是否在内存中
【发布时间】:2013-12-10 21:31:04
【问题描述】:

有没有办法在 Windows 中检查页面是在内存中还是在磁盘中(交换空间)? 我想知道这一点的原因是,如果页面在磁盘中,通过不访问该页面来避免导致页面错误。

【问题讨论】:

  • 为什么? (你为什么不让操作系统完成它管理内存的工作?你所做的工作有什么特别之处,它是如此接近硬件级别吗?)
  • 我很好奇实际的应用程序是什么,它是一个选项在请求时访问交换的数据。你的解决方案是什么?
  • 这是不可能的。这样的状态指示永远不会可靠。它可以告诉您一个页面已被换出,但它从不保证当您实际访问该页面时它仍在 RAM 中。 check-and-pagelock 方案非常昂贵且未提供。
  • @HansPassant:OP 似乎出于性能原因要求提供提示,所以我猜想一个不完美的启发式方法会起作用。尽管如此,以这种方式绕过系统似乎确实是一件非常可疑的事情。
  • 操作系统提供了一些非常基本的保证。能够有效地使用内存当然是核心之一。只有当您的程序没有有效地使用内存时,您才需要寻找解决方法。试图编写代码以确保操作系统在内存方面比您的程序做得更好,这就是把车放在马的前面。

标签: windows memory-management


【解决方案1】:

我知道在用户模式下没有记录的方法可以完成此操作。

也就是说,可以在内核模式下确定这一点,但这将涉及检查属于内存管理器的页表条目 - 这不是您在任何类型的生产代码中真正不想做的事情.

您要解决的真正问题是什么?

【讨论】:

  • 我正在开发内存恶意软件扫描程序。在这种情况下,通过知道页面是否是页面(内存或磁盘)的位置,我可以采取不同的行动。
【解决方案2】:

虚拟内存的全部意义在于将这类东西抽象掉。如果您将自己的数据存储在用户空间中,请将其放入支持缓存的数据结构中,不要考虑页面。

如果您在内核空间编写代码,我知道在 linux 中您需要将内存地址从用户空间转换为内核空间地址,然后在 VMM 中调用 API 来获取 page_table_entry,然后是地址中的页面结构。完成后,您可以使用逻辑运算符检查标志,其中之一是“交换的”。但是,如果您想快速完成某些事情,则在页面级别遍历和弄乱内存可能不是最有效(或最安全)的事情。

需要更多信息才能提供更完整的答案。

【讨论】:

  • 我的代码在内核空间。我正在写内存恶意软件扫描仪。在这种情况下,通过知道页面是否是页面(内存或磁盘)的位置,我可以采取不同的行动。
  • 我为 linux+Xen VM 写了一些类似的东西来检测恶意软件打包。 M$ 可能有这样的内部文档,但它很可能是特权信息。您可能需要 a) 弄清楚如何获取这些文档,b) 找到通过经验“知道”这些事情的人,或者 c) 启动一个工具来发现内存中的对象或对内核进行逆向工程。就我而言,我只需要阅读 Linux 源代码就可以弄清楚这些东西。现在确定如何处理 Win 内核。在封闭源代码方面,我可以为您提供尽可能多的帮助。
  • 谢谢。我将尝试查看社区中是否有人知道一些未记录的内核数据结构,其中包含我需要的信息。否则,我将回到选项 c 或 a。
猜你喜欢
  • 1970-01-01
  • 2012-07-23
  • 2014-05-30
  • 1970-01-01
  • 2014-07-14
  • 2013-08-25
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多