get_free_page分配大块内存空间

分配页内存的函数们:

unsigned long get_zeroed_page(unsigned int flags);

******分配一页内存,返回一个指向新页的指针并且对该页进行了清零操作

unsigned long __get_free_page(unsigned int flags);

******分配一页内存,返回一个指向新页的指针,没有对该页进行清零操作.

unsigned long __get_free_pages(unsigned int flags, unsigned int order);

******用来分配多页内存的,分配的内存可能是物理上连续的几个页长,但没有清零.

******对于你自己指定要分配多少字节的时候,若要使用__get_free_pages时,需要调用get_order函数来帮你计算这些你分配的字节是多少页,有时分配的比你要求的多,这是因为不足一页的按照一页的大小来计算.
******order是2的幂数,即order=0,是一页,order=1是两页,order=2,是四页,order=3是八页......

******如果order太大没有连续大小的内存区可用,页内存分配会失败.order允许的最大值是10(1024页)或者11(2048页).

 int get_order(unsigned long size)

******用来计算size可以分成多少页的,返回值是2的幂

当使用完分配的内存的时候务必要释放这些内存,避免内存泄露(内存越用越少),使用下面的函数

void free_pages(unsigned long addr, unsigned long order)

******用来释放分配的多页内存

void free_page(unsigned long addr)

******用来释放分配的一页内存.

########################################################################################################

驱动模块实例:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>

static int __init my_init(void)
{
	
	char *str;

	unsigned int order;

	order = get_order(10 * PAGE_SIZE);//PAGE_SIZE的大小是4K,即1<<12	

	str = __get_free_pages(GFP_KERNEL, order);
	
	printk("order = %d\n", order);

	if(str == NULL){
		return -1;
	}else{
		sprintf(str, "hello ...%d...\n", 249);	
		printk("%s", str);
		free_pages((unsigned long)str, order);
	}
	
	return 0;
}


static void __exit my_exit(void)
{
	printk("Goodbye, world!\n");		
}

module_init(my_init);
module_exit(my_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Millet");
MODULE_VERSION("MI 2.0");
MODULE_DESCRIPTION("Test for driver model");


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值