Linux启动内存分配器是在伙伴系统、slab机制实现之前,为满足内核中内存的分配而建立的。本身的机制比较简单,使用位图来进行标志分配和释放。
一、数据结构介绍
1,保留区间
因为在建立启动内存分配器的时候,会涉及保留内存。也就是说,之前保留给页表、分配器本身(用于映射的位图)、io等得内存在分配器建立后,当用它来分配内存空间时,保留出来的那些部分就不能再分配了。linux中对保留内存空间的部分用下列数据结构表示
[cpp]- /* * Early reserved memory areas.
- */ #define MAX_EARLY_RES 20/*保留空间最大块数*/
- struct early_res {/*保留空间结构*/
- u64 start, end; char name[16];
- char overlap_ok; };
- /*保留内存空间全局变量*/ static struct early_res early_res[MAX_EARLY_RES] __initdata = {
- { 0, PAGE_SIZE, "BIOS data page" }, /* BIOS data page */ {}
- };
- /* * node_bootmem_map is a map pointer - the bits represent all physical
- * memory pages (including holes) on the node. */
- /*用于bootmem分配器的节点数据结构*/ typedef struct bootmem_data {
- unsigned long node_min_pfn;/*存放bootmem位图的第一个页面(即内核映象结束处的第一个页面)。*/ unsigned long node_low_pfn;/*物理内存的顶点,最高不超过896MB。*/
- void *node_bootmem_map; unsigned long last_end_off;/*用来存放在前一次分配中所分配的最后一个字节相对于last_pos的位移量*/
- unsigned long hint_idx;/*存放前一次分配的最后一个页面号*/ struct list_head list;
- } bootmem_data_t;
- static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list);