歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux啟動內存分配器

Linux啟動內存分配器是在伙伴系統、slab機制實現之前,為滿足內核中內存的分配而建立的。本身的機制比較簡單,使用位圖來進行標志分配和釋放。

一、數據結構介紹

1,保留區間

因為在建立啟動內存分配器的時候,會涉及保留內存。也就是說,之前保留給頁表、分配器本身(用於映射的位圖)、io等得內存在分配器建立後,當用它來分配內存空間時,保留出來的那些部分就不能再分配了。linux中對保留內存空間的部分用下列數據結構表示

[cpp]
  1. /* 
  2.  * Early reserved memory areas. 
  3.  */  
  4. #define MAX_EARLY_RES 20/*保留空間最大塊數*/   
  5.   
  6. struct early_res {/*保留空間結構*/  
  7.     u64 start, end;  
  8.     char name[16];  
  9.     char overlap_ok;  
  10. };  
  11. /*保留內存空間全局變量*/  
  12. static struct early_res early_res[MAX_EARLY_RES] __initdata = {  
  13.     { 0, PAGE_SIZE, "BIOS data page" }, /* BIOS data page */  
  14.     {}  
  15. };  
2,bootmem分配器

[cpp]
  1. /* 
  2.  * node_bootmem_map is a map pointer - the bits represent all physical  
  3.  * memory pages (including holes) on the node. 
  4.  */  
  5.  /*用於bootmem分配器的節點數據結構*/  
  6. typedef struct bootmem_data {  
  7.     unsigned long node_min_pfn;/*存放bootmem位圖的第一個頁面(即內核映象結束處的第一個頁面)。*/  
  8.     unsigned long node_low_pfn;/*物理內存的頂點,最高不超過896MB。*/  
  9.     void *node_bootmem_map;  
  10.     unsigned long last_end_off;/*用來存放在前一次分配中所分配的最後一個字節相對於last_pos的位移量*/  
  11.     unsigned long hint_idx;/*存放前一次分配的最後一個頁面號*/  
  12.     struct list_head list;  
  13. } bootmem_data_t;  
全局鏈表

[cpp]
  1. static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);  
Copyright © Linux教程網 All Rights Reserved