1 實體記憶體初始化——引導分配器memblock
Linux核心啟動時,先要初始化實體記憶體,這個階段的作用主要是確定實體記憶體大小,哪些是可用的?哪些是預留的?完成這一階段工作的是memblock引導分配器。
核心啟動時初始化實體記憶體的處理函式呼叫路徑大概是(基於Linux 5.10.1原始碼檢視):
start_kernel(void)
-->setup_arch(&command_line)
-->setup_machine_fdt
-->early_init_dt_scan_nodes
-->of_scan_flat_dt
-->early_init_dt_scan_memory
上文中early_init_dt_scan_memory會讀取dts中的memory節點,然後呼叫early_init_dt_add_memory_arch-->memblock_add-->memblock_add_range在memblock資料結構中新增實體記憶體。這裡我們仔細看下memblock的資料結構(memblock.h檔案中):
從以上三個結構體我們不難看出,memblock結構體保護成員struct memblock_type memory成員和struct memblock_type reserved成員,memory就是可以的記憶體區域,而reserved就是預留的記憶體區域。struct memblock_type中又有指標指向memblock_region,memblock_region則記錄了每個記憶體分割槽。
我們接下來仔細看下程式碼memblock_add和memblock_reserve(在mm/memblock.c中),
1.1 memblcok中memory和reserved的差別
先休息,明天繼續~
參考連結:Linux記憶體管理 (1)實體記憶體初始化 - ArnoldLu - 部落格園 (cnblogs.com)