内核的bootmem内存分配器
在内核启动期间,伙伴系统内存管理器还没有建立之前,内核此时也要分配内存以及创建一些用于建立内存管理等机制的数据结构,此时内存分配和管理就是由bootmem内存分配器来完成的。
bootmem的建立要求就是简单,越简单越好,因为一旦伙伴系统建立之后,就不需要bootmem了,因此对性能和通用性等要服从一切从简的原则。在了解这个分配器之后,就会知道它真的很简单。
该分配器使用一个位图来管理页,位图比特位的数目与系统中物理内存页的数目相同,比特位为1时,表示这个页已经分配,为0时,表示当前指示的页是空闲的。在需要分配内存时,分配器扫描整个位图,直到找到一个能够提供足够连续页的位置。
下面分析一下这个分配器。
一,前提
在这个分配器被建立之前,先了解一下内核此时是一个什么样的状态,主要说内存方面的。
内存在检测系统可用内存之后,被存入一个数组之中,其结构如下:
page = virt_to_page(bdata->node_bootmem_map);count = 0;idx = (get_mapsize(bdata) + PAGE_SIZE-1) >> PAGE_SHIFT;for (i = 0; i < idx; i++, page++) {__free_pages_bootmem(page, 0);count++;}total += count;bdata->node_bootmem_map = NULL;