内存管理API之alloc_pages_exact

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值