內存管理-2---分配內存經常使用函數(按頁分配)

Makefilelinux

  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緩存

 Makefile  mmc1.c  mmc.c                                                                                                                                                                                                                                                                                          X
  1 #include <linux/init.h>
  2 #include <linux/sched.h>
  3 #include <linux/module.h>
  4 #include <linux/mm.h>
  5 #include <linux/highmem.h>
  6 //內核代碼工做在兩種環境下:
  7 //      1/中斷上下文  不容許睡眠
  8 //      2/進程上下文    容許睡眠
  9 
 10 /*
 11 內核中存放不少個page結構體都是連續的:page+1就是下一個page的地址
 12 page
 13 page
 14 page
 15 page
 16 page
 17 page
 18 */
 19 
 20 static __init int test_init(void)
 21 {
 22         //申請大內存
 23         struct page *pages,*page_4k;
 24         char *v;
 25         //GFP_KERNEL:再分配內存的時候容許睡眠
 26         //GFP_ATOMIC:再分配內存的時候不容許睡眠
 27         //申請2^n此方個page
 28         //方式1 申請2個頁
 29         pages = alloc_pages(GFP_KERNEL,1);
 30         //獲取申請的物理內存的虛擬地址
 31         v = page_address(pages);
 32         //使用
 33         memcpy(v,"111111",6);
 34         printk("v1=%s\n",v);
 35         printk("v1=%x\n",v);
 36         //釋放內存
 37         __free_pages(pages,1);
 38 
 39         //方式2 只是申請一個頁4k
 40         page_4k = alloc_page(GFP_KERNEL);
 41         v = page_address(page_4k);
 42         memcpy(v,"222222",6);
 43         printk("v2=%s\n",v);
 44         printk("v2=%x\n",v);
 45         __free_pages(page_4k,0);
 46 
 47         //方式3 申請2個頁
 48         v = (void*)__get_free_pages(GFP_KERNEL,1);
 49         memcpy(v,"333333",6);
 50         printk("v3=%s\n",v);
 51         printk("v3=%x\n",v);
 52         free_pages((unsigned long)v,1);
 53 
 54         //方式4 下面只申請一個頁
 55         //__GFP_HIGH :在高端內存申請
 56         pages = alloc_page(__GFP_HIGH);
 57         //永久映射:會睡眠:因此這個方法只能在進程上下文使用
 58         v = kmap(pages);
 59         memcpy(v,"444444",6);
 60         printk("v4=%s\n",v);
 61         printk("v4=%x\n",v);
 62         //高端內存須要本身解除映射,normal內存是內核本身映射的,不須要咱們來解除映射
 63         kunmap(pages);
 64         __free_page(pages);
 65 
 66         //方式5 臨時映射:用完以後趕快釋放,由於是環形緩存,有可能被覆蓋掉
 67         pages = alloc_page(__GFP_HIGH);
 68         //不會睡眠:因此這個方法能夠在中斷上下文使用
 69         //臨時映射:速度快,用完以後趕快釋放,由於是環形緩存,有可能被覆蓋掉
 70         v = kmap_atomic(pages);
 71         memcpy(v,"555555",6);
 72         printk("v5=%s\n",v);
 73         printk("v5=%x\n",v);
 74         //高端內存須要本身解除映射,normal內存是內核本身映射的,不須要咱們來解除映射
 75         __kunmap_atomic(v);
 76         __free_page(pages);
 77 
 78         printk("mmc init!\n");
 79         return 0;
 80 }
 81 static __exit void test_exit(void)
 82 {
 83         printk("mmc exit!\n");
 84 }
 85 
 86 module_init(test_init);
 87 module_exit(test_exit);
 88 MODULE_LICENSE("GPL");
 89 

board:atom

root@board liuye_dir#insmod mmc.ko 
[  165.700000] v1=111111
[  165.700000] v1=ec44e000
[  165.705000] v2=222222
[  165.705000] v2=ecbcf000
[  165.705000] v3=333333
[  165.705000] v3=ec44e000
[  165.705000] v4=444444
[  165.705000] v4=ecbcf000
[  165.705000] v5=555555
[  165.705000] v5=ecbcf000
[  165.705000] mmc init!
root@board liuye_dir#rmmod mmc.ko 
[  167.770000] mmc exit!
root@board liuye_dir#
相關文章
相關標籤/搜索