当前位置 : 主页 > 编程语言 > c++ >

c – 内核将内存归零?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在使用Debian挤压并注意到内存始终为零.这是 Linux发行版中的新功能吗?前段时间,我相信我可以使用puts()并输出垃圾. 我多次运行这个测试程序,但评论的结果总是一样的. (我在sysc
我正在使用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.");
}

是否有可能使系统内存不为零?这个Debian挤压安装有哪些选项可以激活始终为零内存?

在任何现代操作系统中,新获取的内存将包含非零值的唯一方法是先前由程序释放的内存被malloc重用.当从操作系统(内核)获得新内存时,它最初是纯虚拟的.它没有物质存在;相反,它被映射为单个共享内存页面的写时复制映射,其中包含0个字节.第一次尝试写入时,内核将捕获写入,分配新的物理内存页,将原始页面的内容(在本例中为0字节)复制到新页面,然后恢复你的计划.如果内核知道新分配的物理内存已经零填充,它甚至可以优化复制步骤.

这个程序既必要又有效.这是必要的,因为将可能包含来自内核或其他用户进程的私有数据的内存移交给您的进程将是一个严重的安全漏洞.这是有效的,因为在分配时不执行归零; “零填充”页面只是对共享零页面的引用.

网友评论