歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux啟動內存分配器

Linux啟動內存分配器

日期:2017/2/28 15:57:28   编辑:Linux教程

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

一、數據結構介紹

1,保留區間

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

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