Linux啟動內存分配器是在伙伴系統、slab機制實現之前,為滿足內核中內存的分配而建立的。本身的機制比較簡單,使用位圖來進行標志分配和釋放。
一、數據結構介紹
1,保留區間
因為在建立啟動內存分配器的時候,會涉及保留內存。也就是說,之前保留給頁表、分配器本身(用於映射的位圖)、io等得內存在分配器建立後,當用它來分配內存空間時,保留出來的那些部分就不能再分配了。linux中對保留內存空間的部分用下列數據結構表示
[cpp]
- /*
- * Early reserved memory areas.
- */
- #define MAX_EARLY_RES 20/*保留空間最大塊數*/
-
- struct early_res {/*保留空間結構*/
- u64 start, end;
- char name[16];
- char overlap_ok;
- };
- /*保留內存空間全局變量*/
- static struct early_res early_res[MAX_EARLY_RES] __initdata = {
- { 0, PAGE_SIZE, "BIOS data page" }, /* BIOS data page */
- {}
- };
2,bootmem分配器
[cpp]
- /*
- * node_bootmem_map is a map pointer - the bits represent all physical
- * memory pages (including holes) on the node.
- */
- /*用於bootmem分配器的節點數據結構*/
- typedef struct bootmem_data {
- unsigned long node_min_pfn;/*存放bootmem位圖的第一個頁面(即內核映象結束處的第一個頁面)。*/
- unsigned long node_low_pfn;/*物理內存的頂點,最高不超過896MB。*/
- void *node_bootmem_map;
- unsigned long last_end_off;/*用來存放在前一次分配中所分配的最後一個字節相對於last_pos的位移量*/
- unsigned long hint_idx;/*存放前一次分配的最後一個頁面號*/
- struct list_head list;
- } bootmem_data_t;
全局鏈表
[cpp]
- static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);