![48ea981d42fe298368f5e6e452a52bab.png](https://img-blog.csdnimg.cn/img_convert/48ea981d42fe298368f5e6e452a52bab.png)
概述:
本篇主要是对伙伴系统的页面分配器的实现进行一个梳理。在内核中伙伴系统算得上内存管理的一个基石了,毕竟页面的分配全权由它负责,即使是slab分配器也是在它的基础上进行实现的。页面分配器的函数在内核中有着各种各样的版本,不论是返回虚拟地址的还是返回struct page指针的,最终都会调用一个共同的接口:__alloc_pages_nodemask()
页面分配API:
以下是几个常见的页面分配函数,可以看到最终都会调用__alloc_pages_nodemask()
__alloc_pages_node /*返回struct page的指针*/
__alloc_pages
__alloc_pages_nodemask
alloc_pages /*返回struct page的指针*/
alloc_pages_current
__alloc_pages_nodemask
__get_free_pages /*返回页面的虚拟地址*/
__get_free_pages
alloc_pages
alloc_pages_current
__alloc_pages_nodemask
核心梳理__alloc_pages_nodemask():
上面我们看到__alloc_pages_nodemask()即页面分配器的'心脏'了,接下来我们就梳理下这颗'心脏'中都具体做了哪些事情,主要有三步:
__alloc_pages_nodemask
prepare alloc_context //1.准备参数
get_page_from_freelist //2.快路径尝试分配内存
__alloc_pages_slowpath //3.慢路径尝试分配内存
细节如下:
![faa5d045a9657917b8acf2a5b5f5ee2e.png](https://img-blog.csdnimg.cn/img_convert/faa5d045a9657917b8acf2a5b5f5ee2e.png)
由于分配过程很