Linux启动内存分配器

字体大小: 中小 标准 ->行高大小: 标准

Linux启动内存分配器是在伙伴系统、slab机制实现之前,为满足内核中内存的分配而建立的。本身的机制比较简单,使用位图来进行标志分配和释放。

一、数据结构介绍

1,保留区间

因为在建立启动内存分配器的时候,会涉及保留内存。也就是说,之前保留给页表、分配器本身(用于映射的位图)、io等得内存在分配器建立后,当用它来分配内存空间时,保留出来的那些部分就不能再分配了。linux中对保留内存空间的部分用下列数据结构表示

[cpp]
  1. /*   * Early reserved memory areas. 
  2.  */   #define MAX_EARLY_RES 20/*保留空间最大块数*/   
  3.    struct early_res {/*保留空间结构*/  
  4.     u64 start, end;       char name[16];  
  5.     char overlap_ok;   };  
  6. /*保留内存空间全局变量*/   static struct early_res early_res[MAX_EARLY_RES] __initdata = {  
  7.     { 0, PAGE_SIZE, "BIOS data page" }, /* BIOS data page */       {}  
  8. };  
2,bootmem分配器

[cpp]
  1. /*   * node_bootmem_map is a map pointer - the bits represent all physical  
  2.  * memory pages (including holes) on the node.   */  
  3.  /*用于bootmem分配器的节点数据结构*/   typedef struct bootmem_data {  
  4.     unsigned long node_min_pfn;/*存放bootmem位图的第一个页面(即内核映象结束处的第一个页面)。*/       unsigned long node_low_pfn;/*物理内存的顶点,最高不超过896MB。*/  
  5.     void *node_bootmem_map;       unsigned long last_end_off;/*用来存放在前一次分配中所分配的最后一个字节相对于last_pos的位移量*/  
  6.     unsigned long hint_idx;/*存放前一次分配的最后一个页面号*/       struct list_head list;  
  7. } bootmem_data_t;  
全局链表

[cpp]
  1. static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);  

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/57885.html