Linux 内核中的清零页是什么?

问题描述 投票:0回答:1

在 Linux 内核中,“清零页面”实际上意味着什么? 我尝试过将其与免费页面相关联,但没有多大意义。

linux memory-management linux-kernel paging
1个回答
3
投票

清零页面是页面中所有位都设置为 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;
}

正如 @0andriy 的评论中所指出的,我使用

calloc
的原始示例是使用“零页”实现的,这是一个充满零的页面,所有 calloc 都可以使用此处描述的写时复制优化返回.

© www.soinside.com 2019 - 2024. All rights reserved.