内核函数pages相关

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>

例子如下:

扫描二维码关注公众号,回复: 2522750 查看本文章

猜你喜欢

转载自blog.csdn.net/yldfree/article/details/81190499