首页 / 资讯中心 / 文章详情

page_alloc prep_compound_page

page_alloc prep_compound_page ★ FEATURED ARTICLE
prep_compound_page是复合页Compound Page的构造函数用于把一个高阶物理连续页块初始化为一个在逻辑上可视为“单一更大页”的复合页。它是在分配高阶页且指定了__GFP_COMP标志时由prep_new_page调用的。函数签名void prep_compound_page(struct page *page, unsigned int order)参数page: 指向复合页的首页head page。参数order: 分配阶数页块包含2^order个物理连续页。核心作用建立 Head/Tail 关系物理内存本身就是连续的prep_compound_page的作用是在struct page元数据层面建立一种层级关系让内核能把这一组页当成一个整体来管理。它主要完成两件事标记首页将第一个struct page标记为“头”Head设置PG_head标志。设置尾页对后续的每一个“尾页”Tail page设置其compound_head指针指向头页并设置PG_tail标志。同时在第一个尾页中记录整个复合页的order。为什么需要它这是内核内存管理的关键抽象主要用于大页支持透明大页THP和 hugetlbfs 都依赖复合页。CPU 的页表项可以指向一个“大页”从而减少 TLB miss提升性能。统一管理通过将一组页标记为复合页上层代码如文件系统可以用folio现代内核中代表复合页的结构来统一操作而无需关心底层的多个struct page。典型的路径如folio_alloc会加上__GFP_COMP进而触发prep_compound_page。正确的释放当复合页被释放时内核能通过compound_order知道它实际占用了多少个页从而正确地归还给伙伴系统。在分配路径中的位置它位于页分配的核心路径上调用链大致如下__alloc_pages - get_page_from_freelist - prep_new_page - prep_compound_pageprep_compound_page本身只负责“元数据标记”并不涉及物理内存的清零或映射。它通常在页面内容被使用之前、在post_alloc_hook之前或之后执行具体顺序取决于内核版本对初始化流程的调整。
阅读完成 · 觉得有帮助?
咨询建站