boot memory allocator——自举内存分配器(五:停用bootmem)
在系统初始化进行到伙伴系统分配器能够承担内存管理的责任后,必须停用bootmem分配器,毕竟不能同时用两个分配器管理内存。在UMA和NUMA系统上,停用分别由free_all_bootmem和free_all_bootmem_node完成。在伙伴系统建立以后,特定于体系结构的初始化代码需要调用这两个函数。本文还是选择讨论UMA系统。
free_all_bootmem如下:
fastcall void __free_pages(struct page *page, unsigned int order){if (put_page_testzero(page)) {//把 page 的计数原子性的减 1 ,并测试是否为 0 ,如果为 0 ,返回 true,否则返回 falseif (order == 0)free_hot_page(page);//把该页释放到该页所属内存node的内存页区的当前处理器的“热区”高数缓存内存中,后面的文章会详细讨论else__free_pages_ok(page, order);//否者就调用伙伴系统内存释放操作函数,后面的文章会详细讨论}}