我凭经验确定,在我的系统上,创建为特定大小的内存映射文件在默认情况下总是完全清零。例如,使用调用
HANDLE hMM =
CreateFileMapping (h,
NULL,
PAGE_READWRITE,
0,
0x01400000,//20MB
NULL);
..并且写入该文件的映射视图总是会产生一个完全清零的 20MB 文件,除非我写入了非零数据。
我想知道文件的未初始化部分是否可以假定为零。一般来说,这种行为在 Windows 上得到保证吗?
The 创建文件映射文档(Remarks部分)明确指出
如果文件被扩展,则旧文件尾和新文件尾之间的文件内容不保证为零;该行为由文件系统定义。
所以,如果你的磁盘上的文件一开始是空的,那就是not保证归零(因为您正在扩展它);我不认为文件系统驱动程序会冒着以这种方式泄露潜在敏感信息的风险,但谁知道呢,也许某些文件系统驱动程序会回收已用于您的进程的页面(这不应该是安全风险)。
另一方面,我不知道根本不提供安全性的文件系统(例如 FAT)是否会如此关心为您提供它们碰巧为文件的新部分分配的簇的内容。
相反,如果您创建的内存部分不是由磁盘上的文件支持,而是由分页文件支持,则可以保证您获得的内存全部清零:
操作系统页面文件支持的文件映射对象中页面的初始内容为 0(零)。
这是可以保证的,因为在创建仅内存页面文件时,内存管理器可以完全控制正在发生的事情,并且它从空白页面池中获取页面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)