Linux内核:paging_init时零页分配的作用
Posted
技术标签:
【中文标题】Linux内核:paging_init时零页分配的作用【英文标题】:Linux kernel: Role of zero page allocation at paging_init time 【发布时间】: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的一部分。
【问题讨论】:
【参考方案1】:零页面是用零填充的页面。您可以映射到此页面并获得宽零虚拟区域。每当您写信到此页面之一时,COW 将起作用,您将获得一个新页面。反过来也是如此:如果您有一个零数据的内存区域,您可以将此数据映射到零页面并释放这些具有“0”数据的页面。换句话说,这是关于内核如何节省内存的。
附言注意COW不是和零页直接连接的,是一个更宽泛的概念
来自@artless_noise 的补充:
它还允许分配一个大数组,但不消耗内存。所有页面最初都是零页面并映射到相同的物理零页面。如果数组是稀疏的,那么只有少数条目(4k 大小)会消耗内存。内核不需要清理(零)分配的内存。 'tlb' 和 'cache' 不会浪费在填充条目上。
【讨论】:
它还允许分配一个大数组,但不消耗内存。所有页面最初都是零页面并映射到同一个物理零页面。如果数组是稀疏的,那么只有少数条目(4k 大小)会消耗内存。内核不需要清理(零)分配的内存。 'tlb' 和 'cache' 不会浪费在填充条目上。我认为这是另外三个原因,请随时将其添加到您的答案中,我将删除我的评论。 我可以理解这种技术可以保存缓存条目,因为缓存是用物理地址索引的,但是TLB条目仍然会被浪费,因为TLB是用虚拟地址索引的,对吧?以上是关于Linux内核:paging_init时零页分配的作用的主要内容,如果未能解决你的问题,请参考以下文章