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

标签 c++ windows kernel memory-mapped-files

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

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/

相关文章:

c++ - 在 C++ 类中具有公共(public)属性

c/windows : opening all . 目录中的 txt 文件

linux - 为什么 kthread 有 pid 2 而 systemd 有 PID 1?

c++ - 部分破坏的物体?

c++ - 真的需要在 .h 和 .cpp 文件中分离 C++ 结构吗?

c++ - Windows C++ 线程参数传递

python - 在 Windows 上部署 Python 包,编译依赖项,而不安装 Visual Studio?

c - 简单字符驱动崩溃

assembly - [BITS 16] 和 [ORG 0x0000] 指令的顺序

c++ - 宏的实际参数太多?