内存管理---分配内存常用函数

Makefile

  1 LINUX_SRC :=/home/liuye/tiny4412/FriendlyARM_kernel/linux-3.5
  2 #obj-m  += module.o            #生成module.ko   但我们写module.o就可以
  3 #module-objs=param.o     #这里写要编译文件
  4 obj-m +=mmc.o       #这是单文件的编译:上面两行是多文件的编译,更加方便
  5 
  6 all:
  7         make -C $(LINUX_SRC) M=`pwd` modules
  8 clean:
  9         make -C $(LINUX_SRC) M=`pwd` modules clean

mmc.c

  1 #include <linux/init.h>
  2 #include <linux/sched.h>
  3 #include <linux/module.h>
  4 #include <linux/mm.h>
  5 //内核代码工作在两种环境下:
  6 //      1/中断上下文  不允许睡眠
  7 //      2/进程上下文    允许睡眠
  8 
  9 /*
 10 内核中存放很多个page结构体都是连续的:page+1就是下一个page的地址
 11 page
 12 page
 13 page
 14 page
 15 page
 16 page
 17 */
 18 
 19 static __init int test_init(void)
 20 {
 21         //申请大内存
 22         struct page *pages,*page_4k;
 23         char *v;
 24         //GFP_KERNEL:再分配内存的时候允许睡眠
 25         //GFP_ATOMIC:再分配内存的时候不允许睡眠
 26         //申请2^n此方个page
 27         //方式1 申请2个页
 28         pages = alloc_pages(GFP_KERNEL,1);
 29         //获取申请的物理内存的虚拟地址
 30         v = page_address(pages);
 31         //使用
 32         memcpy(v,"111111",6);
 33         printk("v1=%s\n",v);
 34         printk("v1=%x\n",v);
 35         //释放内存
 36         __free_pages(pages,1);
 37 
 38         //方式2 只是申请一个页4k
 39         page_4k = alloc_page(GFP_KERNEL);
 40         v = page_address(page_4k);
 41         memcpy(v,"222222",6);
 42         printk("v2=%s\n",v);
 43         printk("v2=%x\n",v);
 44         __free_pages(page_4k,0);
 45 
 46         //方式3 申请2个页
 47         v = (void*)__get_free_pages(GFP_KERNEL,1);
 48         memcpy(v,"333333",6);
 49         printk("v3=%s\n",v);
 50         printk("v3=%x\n",v);
 51         free_pages((unsigned long)v,1);
 52 
 53         printk("mmc init!\n");
 54         return 0;
 55 }
 56 static __exit void test_exit(void)
 57 {
 58         printk("mmc exit!\n");
 59 }
 60 
 61 module_init(test_init);
 62 module_exit(test_exit);
 63 MODULE_LICENSE("GPL");

board:

root@board liuye_dir#insmod mmc.ko 
[  390.045000] v1=111111
[  390.045000] v1=ec406000
[  390.045000] v2=222222
[  390.045000] v2=ecbfd000
[  390.045000] v3=333333
[  390.045000] v3=ec406000
[  390.045000] mmc init!
root@board liuye_dir#rmmod mmc.ko 
[  398.080000] mmc exit!
root@board liuye_dir#

猜你喜欢

转载自www.cnblogs.com/axjlxy/p/8971201.html