【问题标题】:Linux kernel: Role of zero page allocation at paging_init timeLinux内核:paging_init时零页分配的作用
【发布时间】:2016-06-03 12:38:19
【问题描述】:

我正在尝试了解启动时为 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的一部分。

【问题讨论】:

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


    【解决方案1】:

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

    附言注意COW不是和零页直接连接的,是一个更宽泛的概念

    来自@artless_noise 的补充:

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

    【讨论】:

    • 它还允许分配一个大数组,但不消耗内存。所有页面最初都是零页面并映射到同一个物理零页面。如果数组是稀疏的,那么只有少数条目(4k 大小)会消耗内存。内核不需要清理(零)分配的内存。 'tlb' 和 'cache' 不会浪费在填充条目上。我认为这是另外三个原因,请随时将其添加到您的答案中,我将删除我的评论。
    • 我可以理解这种技术可以保存缓存条目,因为缓存是用物理地址索引的,但是TLB条目仍然会被浪费,因为TLB是用虚拟地址索引的,对吧?
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2022-06-15
    • 2012-07-21
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多