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#