Memory management Linux内核:分页初始化时零页分配的角色

Memory management Linux内核:分页初始化时零页分配的角色,memory-management,linux-kernel,arm,kernel,boot,Memory Management,Linux Kernel,Arm,Kernel,Boot,我试图理解arch/arm启动时的内核内存保留 在setup\u arch()中有一个调用paging\u init(),用于设置页表、初始化区域内存映射等。在分配实际的mem\u map之前,它还分配一个zero page void __init paging_init(const struct machine_desc *mdesc) { void *zero_page; --- zero_page = early_alloc(PAGE_SIZE); ---

我试图理解arch/arm启动时的内核内存保留

setup\u arch()
中有一个调用paging\u init(),用于设置页表、初始化区域内存映射等。在分配实际的
mem\u 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);
}
有人能解释一下零页的作用吗


这个问题是的一部分。

零页是一个充满零的页面。您可以映射到此页面并获得宽零虚拟区域。无论何时,只要你写下这一页,它就会工作,你就会得到一个新的。反之亦然:如果内存区域中的数据为零,则可以将此数据映射到零页,并使用“0”数据释放这些页。换句话说,这是关于内核如何节省内存的问题

p、 请注意,COW与零页并没有直接联系,它是一个更广泛、更普遍的概念

来自@artless\u noise的添加:


它还允许分配大型阵列,但不消耗内存。所有页面最初都是零页面,并映射到同一物理零页面。如果数组是稀疏的,则只有少数条目(4k大小)将消耗内存。内核不需要清理(零)分配的内存。“tlb”和“缓存”不会浪费在填充条目上。

它还允许分配大数组,但不会消耗内存。所有页面最初都是零页面,并映射到同一物理零页面。如果数组是稀疏的,则只有少数条目(4k大小)将消耗内存。内核不需要清理(零)分配的内存。“tlb”和“缓存”不会浪费在填充条目中。我认为这是另外三个原因,请随意将其添加到您的答案中,我将删除我的评论。我可以理解,这种技术可以保存缓存条目,因为缓存是用物理地址索引的,但TLB条目仍然会被浪费,因为TLB是用虚拟地址索引的,对吗?