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#