当前位置: 首页 > Linux kernrl, 内存管理 > 正文

内存管理器(十一)kernel内存管理—页的获取与释放

前言

上一篇说了内存管理的数据结构,现在来说说内存管理的一些接口函数,页的分配与释放。

alloc_pages && __free_pages

写一个内核模块来看看效果


#include<linux/module.h>
#include<linux/sched.h>
#include<linux/mm_types.h>
#include<linux/gfp.h>
#include<linux/mm.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zmrlinux");
MODULE_DESCRIPTION("something about page");

static int __init page_size(void){
    
    struct page * pos;
    char *temp;
    pos = alloc_pages(GFP_KERNEL,2);
    if(NULL == pos){

        printk("alloc failed\n");
        return -1;

    }else{
        printk("First page is %p\n",pos);
        printk("The temp is %p\n",temp);
        temp = (char *)page_address(pos);
        printk("the page address is %p\n",temp);
        
    }
   
    return 0;
}

static void __exit page_size_out(void)
{
    printk("GOODBYE \n");
}

module_init(page_size);
module_exit(page_size_out);

Makefile


obj-m := page_about.o
CURRENT_PATH := ${shell pwd}
CURRENT_KERNEL_PATH := ${shell uname -r}
LINUX_KERNEL_PATH := /usr/src/kernels/$(CURRENT_KERNEL_PATH)

all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
	rm *.o

2015-11-05 09:58:06 的屏幕截图

allco_page(gfp_mask)
只分配一个页,返回指向页的结构指针
alloc_pages(gfp_mask,order)
分配2 的order 幂次的页,返回指向第一个页页结构的指针
__get_free_page(gfp_mask)
只分配一个页,返回指向其逻辑地址的指针
__get_free_pages(gfp_mask,order)
分配2 的order 幂次的页,返回指向其逻辑地址的指针
get_zeroed_page(gfp_mask)
只分配一页,让其内容填充0,返回指向其逻辑地址的指针

void __free_pages(struct page *page,unsigned int order)
void free_pages(unsigned long addr,unsigned int order)
void free_page(unsigned long addr)

以上全部都是页的释放

本文固定链接: http://zmrlinux.com/2015/11/05/%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e5%99%a8%ef%bc%88%e5%8d%81%e4%b8%80%ef%bc%89kernel%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86-%e9%a1%b5%e7%9a%84%e8%8e%b7%e5%8f%96%e4%b8%8e%e9%87%8a%e6%94%be/ | Kernel & Me

该日志由 root 于2015年11月05日发表在 Linux kernrl, 内存管理 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 内存管理器(十一)kernel内存管理—页的获取与释放 | Kernel & Me