【发布时间】: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