Nur*_*ure 11 c memory-management linux-kernel
我正在使用Debian挤压并注意到内存始终为零.这是Linux发行版中的新功能吗?前段时间,我相信我可以使用puts()并输出垃圾.
我多次运行这个测试程序,但评论的结果总是一样的.(我在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.");
}
Run Code Online (Sandbox Code Playgroud)
是否有可能使系统内存不为零?这个Debian挤压安装有哪些选项可以激活始终为零内存?
R..*_*R.. 19
在任何现代操作系统中,新获取的内存将包含非零值的唯一方法是先前由程序释放的内存被重用malloc
.当从操作系统(内核)获得新内存时,它最初是纯虚拟的.它没有物质存在; 相反,它被映射为单个共享内存页面的写时复制映射,其中包含0个字节.第一次尝试写入时,内核将捕获写入,分配新的物理内存页,将原始页面的内容(在本例中为0字节)复制到新页面,然后恢复你的计划.如果内核知道新分配的物理内存已经零填充,它甚至可以优化复制步骤.
这个程序既必要又有效.这是必要的,因为将可能包含来自内核或其他用户进程的私有数据的内存移交给您的进程将是一个严重的安全漏洞.这是有效的,因为在分配时不执行归零; "零填充"页面只是对共享零页面的引用.
根据我在Linux内核开发中的内容,内核执行零页面,因为它可能包含用户程序可以解释的内核数据,并且某种方式可以访问系统.
malloc要求内核提供更多页面,因此内核负责您正在接收的内存.
小智 1
您的代码不会测试所有内存是否都为零 - 它测试两个特定字节是否为零 - a[0] 和 a[5000]。另外,malloc() 与内核无关——它是一个 C 库函数,而不是系统调用。它的实现者零内存的可能性极小——您所看到的只是您的特定配置的一些随机怪癖。