bootmem & buddy Allocator

本文详细介绍了Linux内核中的内存管理机制,包括bootmem内存分配器、BuddyAllocator的初始化过程及其实现原理,还讨论了kmalloc和vmalloc等内存分配函数的工作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 <Pecker.hu@gmail.com>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值