Linux 内核:paging_init 时零页分配的作用

Linux kernel: Role of zero page allocation at paging_init time

我正在尝试了解 arch/arm.

启动时的内核内存预留

setup_arch() 中有一个调用 paging_init() 用于设置页表、区域内存映射初始化等。它还在分配实际 mem_map.

之前分配一个 zero page
void __init paging_init(const struct machine_desc *mdesc)
{
    void *zero_page;
    ---
    zero_page = early_alloc(PAGE_SIZE);
    ---
    empty_zero_page = virt_to_page(zero_page);
    __flush_dcache_page(NULL, empty_zero_page);
}

有人可以解释一下 zero page 的作用吗?

此问题是 this 的一部分。

零页是用零填充的页面。您可以映射到此页面并获得宽零虚拟区域。每当您写入此页面之一时,COW 将起作用,您将获得一个新页面。反之亦然:如果您有一个包含零数据的内存区域,您可以将此数据映射到零页面并释放这些包含“0”数据的页面。换句话说,这就是内核如何节省内存。

p.s。注意COW与零页没有直接联系,它是一个更宽泛的概念

来自@artless_noise的补充:

它也允许分配一个大数组,但不消耗内存。所有页面最初都是零页并映射到相同的物理零页。如果数组是稀疏的,那么只有少数条目(4k 大小)会消耗内存。内核不需要清理(归零)分配的内存。 'tlb' 和 'cache' 不会浪费在填写条目上。