我正在使用 Debian squeeze 并注意到内存总是归零。这是 Linux 发行版中的新功能吗?前段时间,我相信我可以使用 put() 并且会输出垃圾。
我多次运行这个测试程序,但注释的结果总是相同的。 (我在 sysctl.conf 中有 randomize_va_space=2,所以我知道每次运行时都会使用不同位置的内存。)
char *a = malloc(50000000);
a[49999999] = '\0';
puts(a); // it outputs nothing since all are zeroes
printf("%p\n", a);
if(a[5000] == '\0') // this condition is always true
{
puts("It is a nul char.");
}
有没有可能让系统内存不为零?这个 Debian 压缩安装可以激活哪些选项来使内存始终为零?
在任何现代操作系统上,新获得的内存将包含非零值的唯一方法是程序先前释放的内存被重用malloc
。当从操作系统(内核)获取新内存时,它最初是纯虚拟的。它没有物理存在;相反,它被映射为充满 0 字节的单个共享内存页的写时复制映射。第一次尝试写入时,内核将捕获该写入,分配新的物理内存页,将原始页的内容(在本例中均为 0 字节)复制到新页,然后恢复你的程序。如果内核知道新分配的物理内存已经被零填充,它甚至可以优化复制步骤。
这个程序既必要又有效。这是必要的,因为将可能包含来自内核或其他用户进程的私有数据的内存移交给您的进程将是一个严重的安全漏洞。它很高效,因为在分配时不执行归零操作; “零填充”页面只是对共享零页面的引用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)