void *alloc_pages_exact(size_t size, gfp_t gfp_mask)
功能:类似于__get_free_pages其实它内部也是调用了__get_free_pages,不同之处是__get_free_pages会申请2^order个物理页,但此函数申请满足需求的最小页个数
size:需求的内存大小,但需求的和实习分配的不一定会相同
gfp_mask: 分配标识 GFP_KERNEK GFP_ATOMIC等
头文件: #include <linux/gfp.h>
void free_pages_exact(void *virt, size_t size)
功能:释放由alloc_pages_exact分配的内存,其内部会调用free_pages()
virt:由alloc_pages_exact分配的内存的地址
size:内存的大小
头文件: #include <linux/gfp.h>
#define virt_to_page(addr) (mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
功能: 根据虚拟地址转换成对应的page结构体
addr:虚拟地址
返回值: struct page结构体指针
#include <asm/page.h>
下面两个宏将页的引用加1减1
#define page_cache_get(page) get_page(page)
#define page_cache_release(page) put_page(page)
page:struct page结构体指针
头文件;#include <linux/pagemap.h>
static inline int page_count(struct page *page)
功能:获得页的引用计数
page:page结构体
头文件;#include <linux/mm.h>
static inline struct zone *page_zone(struct page *page)
功能:根据物理页获得此页所在的内存区域(DMA32 HIGHMEM NORMAL)
page:物理页结构体指针
返回值:返回代表一个区域的结构指针
头文件:#include <linux/mm.h>
void *page_address(struct page *page)
功能:根据页page获得虚拟地址
page:页结构指针
返回值:页对应的虚拟地址
头文件:#include <linux/mm.h>
例子如下: