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();
正如我们所知,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();