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

时间:2016-02-22 07:08:07

标签: memory-management linux-kernel arm kernel boot

我正在尝试了解arch / arm启动时的内核内存预留。

setup_arch()中有一个调用paging_init()来设置页表,初始化区域内存映射等。在分配实际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);
}

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

此问题是this的一部分。

1 个答案:

答案 0 :(得分:6)

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

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

来自@artless_noise:

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