gpt4 book ai didi

c++ - 默认情况下,Windows 内存映射文件内容是否始终清零?

转载 作者:可可西里 更新时间:2023-11-01 14:38:59 25 4
gpt4 key购买 nike

我根据经验确定,在我的系统上,创建为特定大小的内存映射文件在默认情况下始终完全归零。例如,使用调用

HANDLE hMM = 
CreateFileMapping (h,
NULL,
PAGE_READWRITE,
0,
0x01400000,//20MB
NULL);

.. 并写入该文件的映射 View 总是会产生一个完全归零的 20MB 文件,除非我写入了非零数据。

我想知道是否可以将文件的未初始化部分假定为零。一般来说,这种行为在 Windows 上得到保证吗?

最佳答案

CreateFileMapping文档(备注 部分)明确指出

If the file is extended, the contents of the file between the old end of the file and the new end of the file are not guaranteed to be zero; the behavior is defined by the file system.

因此,如果磁盘上的文件一开始是空的,保证会清零(因为您正在扩展它);我不认为文件系统驱动程序会以这种方式冒泄露潜在敏感信息的风险,但谁知道呢,也许某些文件系统驱动程序会回收已用于您的进程的页面(这不应该是安全风险)。

另一方面,我不知道根本不提供安全性的文件系统(例如 FAT)是否会非常关心为您提供它们恰好为文件的新部分分配的簇的内容.

相反,如果您创建的内存部分不是由磁盘上的文件支持,而是由分页文件支持,则可以保证您获得的内存全部归零:

The initial contents of the pages in a file mapping object backed by the operating system paging file are 0 (zero).

这可能是有保证的,因为在创建纯内存页面文件时,内存管理器可以完全控制正在发生的事情,并且它会从空白页面池中获取页面。

关于c++ - 默认情况下,Windows 内存映射文件内容是否始终清零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com