Linux 中的 struct page* 在哪里初始化?

Where are struct page* initialized in Linux?

正如我们所知,Linux 中的 struct page 与物理 4KB 页面关联并映射到 pfn。这形成了 backbone 到 Linux 中的内存分配。 struct page描述的是include\linux\mm_types.h包含各种信息的页面。我想知道,struct page 在启动期间何时分配,谁初始化这些 struct page 结构以及在哪里(在 linux 中)?

我能够从这个答案中了解页面的存储位置 - 但我无法找到这些结构是如何分配和初始化的。

你应该看看 include/linux/gfp.h 文件。它有一堆 alloc_page 类型的函数。从那里,使用 cscope 或您最喜欢的 IDE,您可以看到调用这些函数的每个函数,这会让您了解这些函数的使用方式。

也许可以尝试 mm_init,由 /init/main.c/ 中的 start_kernel()/arch/x86/mm/init_64.c 中相应的 mem_init 调用:

void __init mem_init(void)
1286 {
1287     pci_iommu_alloc();
1288 
1289     /* clear_bss() already clear the empty_zero_page */
1290 
1291     /* this will put all memory onto the freelists */
1292     memblock_free_all();
1293     after_bootmem = 1;
1294     x86_init.hyper.init_after_bootmem();
1295 
1296     /*
1297      * Must be done after boot memory is put on freelist, because here we
1298      * might set fields in deferred struct pages that have not yet been
1299      * initialized, and memblock_free_all() initializes all the reserved
1300      * deferred pages for us.
1301      */
1302     register_page_bootmem_info();