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