Linux内核中的归零页面是什么?

Linux内核中的归零页面是什么?,linux,memory-management,linux-kernel,paging,Linux,Memory Management,Linux Kernel,Paging,在Linux内核中,“零页面”实际上是什么意思? 我曾尝试过用免费页面进行corelate,但没有多大意义。归零页面是指页面中所有位都设置为0的页面。并非所有归零的页面都是免费的,也并非所有免费页面都必须归零(特定于实现): 一个免费页面并不一定意味着它是零。它可能是设置为无效(未被任何进程使用)的页面,但包含上次使用时的旧数据。出于安全原因,操作系统应该在将页面交给另一个程序之前清空页面 归零的页面也不意味着它是免费页面。当一个进程使用malloc()然后进行读取(在Ubuntu 20.04中

在Linux内核中,“零页面”实际上是什么意思?
我曾尝试过用免费页面进行corelate,但没有多大意义。

归零页面是指页面中所有位都设置为0的页面。并非所有归零的页面都是免费的,也并非所有免费页面都必须归零(特定于实现):

一个免费页面并不一定意味着它是零。它可能是设置为无效(未被任何进程使用)的页面,但包含上次使用时的旧数据。出于安全原因,操作系统应该在将页面交给另一个程序之前清空页面

归零的页面也不意味着它是免费页面。当一个进程使用
malloc()
然后进行读取(在Ubuntu 20.04中测试)时,分配的内存都是零,但是,当然,此时页面不是空闲的。我编写这个C程序是为了验证:

#include <stdio.h>
#include <stdlib.h>

#define PAGE_SIZE 4096
int num_pages = 32;

int main(){
    int i; 
    int bytes = num_pages * PAGE_SIZE;
    char * test = (char *)malloc(bytes);
    if (test == NULL){
        printf("Malloc failed.\n");
        return -1;
    }
 
    for(i =0; i < bytes; i++){
        // A zeroed page will have all (char) zeros in it
        if (test[i] != (char) 0)
            printf("Not (char) 0: %c\n", test[i]);
    }
    return 0;
}
#包括
#包括
#定义页面大小4096
int num_pages=32;
int main(){
int i;
int bytes=num_pages*页面大小;
char*test=(char*)malloc(字节);
if(test==NULL){
printf(“Malloc失败。\n”);
返回-1;
}
对于(i=0;i

正如@0andriy在评论中指出的那样,我最初使用
calloc
的示例是使用“零页”实现的,这是一个充满零的页面,所有calloc都可以使用所描述的写时复制优化返回。

Ha,
calloc()
实际上是由于内核中使用的CoW机制而进行的欺骗。所以,不,
calloc()
不会返回“归零”页面,它会返回零页面-一个特殊的页面,它是归零的,并且始终映射。很好,我将更新我的示例。如果操作系统在分配前将页面归零,您是否同意
malloc
返回归零页面?如果是这样,我将把示例改为
malloc
。否,
malloc()
从页面列表返回一个地址,并标记该地址空间已被占用。你真的需要阅读一些关于现代MMU硬件和操作系统对内存管理的支持。如果您从
malloc()
获得了零内存,那么它是libc分配器,而不是内核分配器。是的,在您读写内存之后,它就被真正分配了,正如我在文章中所写的那样。我还说了具体实施,所以我的答案仍然有效