void *alloc_pages_exact(size_t size, gfp_t gfp_mask)用于分配满足一定大小
的物理上连续的一组页面,它与alloc_pages的区别在于前者分配的size最小单位是页面,而后者是2的
幂次方.
其使用的例程如下:
static int __init crash_save_vmcoreinfo_init(void)
{
vmcoreinfo_note = alloc_pages_exact(VMCOREINFO_NOTE_SIZE,
GFP_KERNEL | __GFP_ZERO);
if (!vmcoreinfo_note) {
free_page((unsigned long)vmcoreinfo_data);
vmcoreinfo_data = NULL;
pr_warn("Memory allocation for vmcoreinfo_note failed\n");
return -ENOMEM;
}
}
其源码分析如下:
void *alloc_pages_exact(size_t size, gfp_t gfp_mask)
{
#根据size 得到是2的几次方
unsigned int order = get_order(size);
unsigned long addr;
#先申请2的order次方的内存,然后再make_alloc_exact 中按照page size 将
#多余的page free掉
addr = __get_free_pages(gfp_mask, order);
return make_alloc_exact(addr, order, size);
}
static void *make_alloc_exact(unsigned long addr, unsigned int order,
size_t size)
{
if (addr) {
#得到申请内存的结束地址
unsigned long alloc_end = addr + (PAGE_SIZE << order);
#得到形参执行size按照page size对齐后的结束地址.
unsigned long used = addr + PAGE_ALIGN(size);
#将这段申请的内存按page 分开
split_page(virt_to_page((void *)addr), order);
while (used < alloc_end) {
#需要申请的内存小于已经申请的内存,,则将多余的内存释放掉
free_page(used);
used += PAGE_SIZE;
}
}
return (void *)addr;
}
内存管理API之alloc_pages_exact
最新推荐文章于 2024-07-17 10:35:38 发布