内存管理之alloc_pages_exact

kernel:5.8.11
定义在/mm/page_alloc.c

/**
 * alloc_pages_exact - 分配物理上连续的精确页数。
 * @size: 要分配的字节数
 * @gfp_mask: 分配的 GFP 标志不能包含 __GFP_COMP
 *
 * 此函数与alloc_pages()相似,不同之处在于,它分配最少数量的页面以满足请求。 alloc_pages()只能在2分之三的页面中分配内存。
 *
 * 此函数也受MAX_ORDER限制。
 *
 * 此函数分配的内存必须由free_pages_exact()释放。
 *
 * Return:指向已分配区域的指针;如果出现错误,则返回%NULL。
 */
void *alloc_pages_exact(size_t size, gfp_t gfp_mask)
{
	unsigned int order = get_order(size);
	unsigned long addr;

	if (WARN_ON_ONCE(gfp_mask & __GFP_COMP))
		gfp_mask &= ~__GFP_COMP;

	addr = __get_free_pages(gfp_mask, order);
	return make_alloc_exact(addr, order, size);
}
EXPORT_SYMBOL(alloc_pages_exact);

kernel:5.8.11
定义在/mm/page_alloc.c

/**
 * free_pages_exact-释放通过alloc_pages_exact()分配的内存
 * @virt:alloc_pages_exact返回的值。
 * @size:分配大小,与传递给alloc_pages_exact()的值相同。
 *
 * 释放先前调用alloc_pages_exact分配的内存。
 */
void free_pages_exact(void *virt, size_t size)
{
	unsigned long addr = (unsigned long)virt;
	unsigned long end = addr + PAGE_ALIGN(size);

	while (addr < end) {
		free_page(addr);
		addr += PAGE_SIZE;
	}
}
EXPORT_SYMBOL(free_pages_exact);

kernel4.19.133
定义在/mm/page_alloc.c

/**
 * alloc_pages_exact - 分配物理上连续的精确页数。
 * @size: 要分配的字节数
 * @gfp_mask: 分配的 GFP 标志不能包含 __GFP_COMP
 *
 * 此函数与alloc_pages()相似,不同之处在于,它分配最少数量的页面以满足请求。 alloc_pages()只能在2分之三的页面中分配内存。
 *
 * 此函数也受MAX_ORDER限制。
 *
 * 此函数分配的内存必须由free_pages_exact()释放。
 *
 * Return:指向已分配区域的指针;如果出现错误,则返回%NULL。
 */
void *alloc_pages_exact(size_t size, gfp_t gfp_mask)
{
	unsigned int order = get_order(size);
	unsigned long addr;

	addr = __get_free_pages(gfp_mask, order);
	return make_alloc_exact(addr, order, size);
}
EXPORT_SYMBOL(alloc_pages_exact);

kernel4.19.133
定义在/mm/page_alloc.c

/**
  * free_pages_exact-释放通过alloc_pages_exact()分配的内存
  * @virt:alloc_pages_exact返回的值。
  * @size:分配大小,与传递给alloc_pages_exact()的值相同。
  *
  *释放先前调用alloc_pages_exact分配的内存。
 */
void free_pages_exact(void *virt, size_t size)
{
	unsigned long addr = (unsigned long)virt;
	unsigned long end = addr + PAGE_ALIGN(size);

	while (addr < end) {
		free_page(addr);
		addr += PAGE_SIZE;
	}
}
EXPORT_SYMBOL(free_pages_exact);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山羊哥-老宋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值