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

enf*_*net 3 boot kernel arm memory-management linux-kernel

我试图了解arch/arm启动时的内核内存预留.

有一个调用paging_init()用于设置页表,初始化区域内存映射等setup_arch().它还zero page在分配实际值之前分配一个mem_map.

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);
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这个角色zero page吗?

这个问题的一部分,这个.

Ale*_*pus 7

零页面是一个填充零的页面.您可以对此页面进行映射并获得宽的归零虚拟区域.每当您写入其中一个页面时,COW将起作用,您将获得一个新页面.反之亦然:如果您的内存区域数据为零,则可以将此数据映射到零页面,并使用"0"数据释放这些页面.换句话说,这是关于内核如何节省内存.

ps请注意,COW不与零页直接连接,它是一个更广泛和一般的概念

另外来自@artless_noise:

它还允许分配大型数组,但不占用内存.所有页面最初都是零页面并映射到相同的物理零页面.如果数组是稀疏的,那么只有少数条目(4k大小)将占用内存.内核不需要清理(零)分配的内存.填充条目不会浪费'tlb'和'cache'.