bootmem allocator是在页表和buddy算法可用之前的一个简单的内存管理机制,是linux内核早期启动过程中的一个过程,也是其他内存管理算法的祖先,其实现方法比较简单,我们只需了解其主要功能和工作原理即可,感觉不必深究。
问题一: bootmem allocator管理的内存范围
pfn=0 到 pfn=max_low_pfn, 即低端常规内存,通常指小于896M的内存。
问题二:bootmem allocator 工作原理
采用简单的映射关系:每 1 bit对应物理内存的一个page frame(页框)。因此,首先要申请一块内存作为映射的位图,位图大小= max_low_pfn/8个字节。
1 先把位图中所有bit置为1,表示对应的page frame不可用
2 根据e820检测到的内存信息(e820.map[]),将类型为E820_RAM的page frame对应的位图中的位置为 0,
表示对应的page frame为空闲状态。
3 将一部分应经被占用的page frame标记为1,表示为不可用的状态。主要包括:
(1) 第一个page frame, 这个page frame有特殊的用途,如BIOS使用,smp某些操作。
(2) 保护模式内核,临时页表,bootmem allocator的位图表
(3) 其他一些特殊的page frame,如EBDA region,ACPI等等
至此,bootmem allocator的初始化工作已经完成。
问题三:bootmem allocator的功能
1 在buddy算法之前,对linux内核的内存使用进行管理
2 初始化node, zone, page体系,为buddy算法做准备
3 建立buddy算法的管理结构,主要是将空闲page frame纳入buddy算法的管理体系
重点讲一下node, zone, page体系结构的建立过程: zone_sizes_init函数先确定不同类型zone的范围,然后在free_area_init_node初始化pglist_data(node),在x86体系结构下只有一个node即contig_page_data,接着初始化这个node中的zone, 再接着计算这个Node有多少个页面,最后向bootmem allocator申请这个多的page frame, 根据page frame来初始化相应数量的page 结构,但是这里仅仅是把所有的page的状态设置为保留,直到最后,内核会在函数free_all_bootmem_core中根据bootmem allocator位图中标识的page frame的状态来设置对应的page结构的状态。
完成了上面的node, zone,page体系结构的初始化后,buddy算法已经可以正确运行了。因为buddy算法主要使用了一个数据结构struct free_area free_area[MAX_ORDER], 这个数据结构正是在free_all_bootmem_core中每次调用__free_pages_bootmem(page, order)对每个页面进行释放,来完成对buddy系统的初始化的。
有关buddy算法的内容,参见《buddy系统的初始化》。
阅读(3342) | 评论(0) | 转发(6) |