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' 不会浪费在填写条目上。
我正在尝试了解 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' 不会浪费在填写条目上。