天天看点

内存管理之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);
           

继续阅读