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]>