bootmem & buddy Allocator

Linux內存分配器分析

1) bootmem_init();

初始化bootmem內存分配器

typedef struct bootmem_data {
     unsigned long node_min_pfn;
     unsigned long node_low_pfn;
     void *node_bootmem_map;    //用於表示物理頁框的使用情況,“1”表示該頁框已用
     unsigned long last_end_off;
     unsigned long hint_idx;
     struct list_head list;
} bootmem_data_t;

 

-------------------

FIXME:map_io中可以分配bootmem

-------------------

 

2) mm_init()初始化Buddy Allocator,當初始化完成後bootmem內存分配器被釋放

 

typedef struct pglist_data {
 struct zone node_zones[MAX_NR_ZONES];
 struct zonelist node_zonelists[MAX_ZONELISTS];
 int nr_zones;
#ifdef CONFIG_FLAT_NODE_MEM_MAP /* means !SPARSEMEM */
 struct page *node_mem_map;    //被Buddy Allocator使用表示物理頁框的使用情況
#ifdef CONFIG_CGROUP_MEM_RES_CTLR
 struct page_cgroup *node_page_cgroup;
#endif
#endif
#ifndef CONFIG_NO_BOOTMEM
 struct bootmem_data *bdata;
#endif
#ifdef CONFIG_MEMORY_HOTPLUG

 spinlock_t node_size_lock;
#endif
 unsigned long node_start_pfn;
 unsigned long node_present_pages; /* total number of physical pages */
 unsigned long node_spanned_pages;

 /* total size of physical page range, including holes */
 int node_id;
 wait_queue_head_t kswapd_wait;
 struct task_struct *kswapd;
 int kswapd_max_order;
} pg_data_t;

 

 

3) struct zone數據結構

 

struct free_area free_area[MAX_ORDER];

//空閒頁框的數據結構,MAX_ORDER=11,標識連續的物理頁框(2^0  ~  2^10)

 

 

struct free_area {
 struct list_head free_list[MIGRATE_TYPES]; //連接空閒的物理頁框
 unsigned long  nr_free;
};

 

 

 

4) kmalloc

使用slab分配器

 

5) vmalloc

 

分配虛擬地址連續,物理地址不連續的地址

FIXME:小於4096Bytes,可用kmallc,用vmalloc得到大於1page的連續虛擬地址。

KVM  Allocator(使用red-black tree)

http://en.wikipedia.org/wiki/Red_black_tree

 

 

cat /proc/buddyinfo

cat /proc/zoneinfo

 

 

Author:Woodpecker <[email protected]>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章