深入浅出内存管理--页分配器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rikeyone/article/details/85224237

页分配器

页分配器是用于整页内存申请的,伙伴系统也是针对页为基本单位的一种算法,因此我们的页分配器是会使用伙伴系统算法的上层接口,为了优化伙伴系统的效率,内核还实现了一个per-cpu的页框高速缓存,这种高速缓存是为了提升页分配器的效率而存在的,当我们申请单个页框的时候会优先从高速缓存中申请,而不用每次都运行伙伴系统算法来进行寻找,这是对伙伴系统的一种补充和优化。下面我们将主要介绍页分配器的上层接口。内部实现后续再一一介绍。

申请物理页面,返回page描述符

struct page *alloc_pages(gfp_t gfp_mask, unsigned int order);
#define alloc_page(gfp_mask) alloc_pages(gfp_mask, 0)

alloc_pages和alloc_page这两个函数都是用于申请物理内存,返回page描述符,而不进行具体的地址映射。

申请物理页面,返回虚拟地址

__get_free_pages(gfp_mask, order)
__get_free_page(gfp_mask)
__get_zero_page(gfp_mask)
__get_dma_pages(gfp_mask, order)

这一系列的内存页面申请是只能用于低端内存的申请,因为它是返回虚拟地址的函数,低端内存属于直接映射区,当申请page完成后,它对应的虚拟地址就已经确定了。
因此可以通过__va来直接获取对应物理页面的虚拟地址。

高端内存申请

高端内存我们不能使用上面返回虚拟地址的方法来进行申请,因为__va这种换算方法只能针对直接映射区,所以高端内存并不是申请下来就能够确定它的虚拟地址的,因此我们需要使用返回page描述符的方法来申请物理页,然后使用前面介绍的高端内存映射的方式来进行映射,从而得到我们能够访问的虚拟地址。

猜你喜欢

转载自blog.csdn.net/rikeyone/article/details/85224237
今日推荐