【问题标题】:VirtualAlloc a writeable, unbacked "throw-away" garbage range?VirtualAlloc 一个可写的、无支持的“丢弃”垃圾范围?
【发布时间】:2019-10-07 02:11:52
【问题描述】:

是否有可能在 Win32 中获得可写(或只写)范围的“垃圾”虚拟地址空间(ie,通过VirtualAlloc、@987654322 @、VirtualAllocEx 或其他)永远不需要持久化,因此理想情况下永远不会由物理内存或页面文件支持?

这将是内存中的一个“洞”。

该场景用于模拟顺序内存写入操作的空运行,只是为了获得它实际消耗的大小。您将能够使用与实际写入完全相同的代码,而是传入一个无支持的“垃圾”地址范围,该地址范围基本上忽略或丢弃写入其中的任何内容。在这个例子中,“void”地址范围的大小可能是 2⁶⁴ = 18.4ᴇʙ(为什么不呢?毕竟它是 nothing),而您感兴趣的只是最终值一个前进的指针。

[edit:] 请参阅 cmets 部分以获得最聪明的答案。即:按顺序多次映射单个4K页面,平铺整个“空”范围

【问题讨论】:

  • DiscardVirtualMemory 很接近,但它是在使用内存后使用的,而不是抢占式的。
  • 更好的方法可能是只提交一页 RAM,但将其多次映射到您的目标地址范围。
  • @BenVoigt 太棒了;希望有一种“适当的”技术,我没有想到 4K 费用的轻微混乱。如果您将其写为答案,我会将其标记为已接受。

标签: winapi memory-address virtual-memory virtual-address-space


【解决方案1】:

这是不可能的。如果您有代码尝试写入内存,则需要为虚拟内存提供支持。

但是,如果您修改了代码以使用流模式,那么您可以提供一个忽略写入并仅跟踪大小的流实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多