我正在尝试了解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的一部分。
答案 0 :(得分:6)
零页面是一个用零填充的页面。您可以对此页面进行映射并获得宽的归零虚拟区域。每当您写入其中一个页面时,COW将起作用,您将获得一个新页面。反之亦然:如果您的内存区域数据为零,则可以将此数据映射到零页面,并使用“0”数据释放这些页面。换句话说,这是关于内核如何节省内存。
P.S。请注意,COW不与零页直接连接,它是一个更广泛和一般的概念
来自@artless_noise:
它还允许分配大型数组,但不占用内存。所有页面最初都是零页面并映射到相同的物理零页面。如果数组是稀疏的,那么只有少数条目(4k大小)将占用内存。内核不需要清理(零)分配的内存。填充条目时不会浪费'tlb'和'cache'。