get_free_page分配大块内存空间

https://blog.csdn.net/wzc18743083828/article/details/18549939?locationNum=10&fps=1


分配页内存的函数们:

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页).

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

 int get_order(unsigned long size)

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

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

void free_pages(unsigned long addr, unsigned long order)

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

void free_page(unsigned long addr)

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

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

驱动模块实例:

[cpp]  view plain  copy
  1. #include <linux/init.h>  
  2. #include <linux/module.h>  
  3. #include <linux/kernel.h>  
  4. #include <linux/slab.h>  
  5. #include <linux/vmalloc.h>  
  6.   
  7. static int __init my_init(void)  
  8. {  
  9.       
  10.     char *str;  
  11.   
  12.     unsigned int order;  
  13.   
  14.     order = get_order(10 * PAGE_SIZE);//PAGE_SIZE的大小是4K,即1<<12      
  15.   
  16.     str = __get_free_pages(GFP_KERNEL, order);  
  17.       
  18.     printk("order = %d\n", order);  
  19.   
  20.     if(str == NULL){  
  21.         return -1;  
  22.     }else{  
  23.         sprintf(str, "hello ...%d...\n", 249);    
  24.         printk("%s", str);  
  25.         free_pages((unsigned long)str, order);  
  26.     }  
  27.       
  28.     return 0;  
  29. }  
  30.   
  31.   
  32. static void __exit my_exit(void)  
  33. {  
  34.     printk("Goodbye, world!\n");          
  35. }  
  36.   
  37. module_init(my_init);  
  38. module_exit(my_exit);  
  39.   
  40. MODULE_LICENSE("GPL");  
  41. MODULE_AUTHOR("Millet");  
  42. MODULE_VERSION("MI 2.0");  
  43. MODULE_DESCRIPTION("Test for driver model");  

猜你喜欢

转载自blog.csdn.net/xiaodingqq/article/details/80787058
今日推荐