分配页内存的函数们:
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");