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_byte.o #这是单文件的编译:上面两行是多文件的编译,更加方便 5 6 all: 7 make -C $(LINUX_SRC) M=`pwd` modules 8 clean: 9 make -C $(LINUX_SRC) M=`pwd` modules clean 10
mmc_byte.c
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 #include <linux/vmalloc.h> 7 #include <linux/slab.h> 8 //查找 9 //内核代码工作在两种环境下: 10 // 1/中断上下文 不允许睡眠 11 // 2/进程上下文 允许睡眠 12 13 /* 14 内核中存放很多个page结构体都是连续的:page+1就是下一个page的地址 15 page 16 page 17 page 18 page 19 page 20 page 21 */ 22 //在内核程序中,申请的内存一定不能有内存泄漏,用完要是放,不然内核就崩溃了. 23 //在应用程序中,如果申请的内存没有使放,越来越多,内核就会把这个进程杀掉,但是内核里面由内存泄漏是没有人可以把内核干掉的. 24 static __init int test_init(void) 25 { 26 char *v; 27 //curent:指针:指向这个进程的task_struct结构体:用来描述进程信息:comm进程名字 28 printk("process:%s\n",current->comm); 29 //打印出来的进程应该是insmod,因为insmod这个进程安装了这段代码 30 //方法1: 31 //kmalloc:分配出来的内存里面存放的数据是随机的; 32 //kzalloc:分配出来的内存里面是被清零的;相当于kmalloc后memset(); 33 //kmalloc:kzalloc:分配的内存物理地址和虚拟地址都是连续的.换句话说,这个函数要求物理内存上有连续的空间,才能分配成功! 34 //v = kmalloc(100,GFP_KERNEL); 35 v = kzalloc(100,GFP_KERNEL); 36 memcpy(v,"123",3); 37 kfree(v); 38 39 //方法2: 40 //只能保证在虚拟地址上是连续的,把零散的物理内存,集中整理映射到虚拟内存上.当然物理内存也有可能是连续的.但是我们做事要严禁不能靠运气. 41 //vmalloc:函数是有可能睡眠的 42 //vmalloc:分配出来的内存里面存放的数据是随机的; 43 //vzalloc:分配出来的内存里面是被清零的;相当于vmalloc后memset(); 44 //v = vmalloc(100); 45 v = vzalloc(100); 46 memcpy(v,"123",3); 47 vfree(v); 48 49 50 51 return 0; 52 } 53 static __exit void test_exit(void) 54 { 55 printk("mmc exit!\n"); 56 } 57 58 module_init(test_init); 59 module_exit(test_exit); 60 MODULE_LICENSE("GPL");
原文地址:https://www.cnblogs.com/axjlxy/p/8976174.html
时间: 2024-11-09 02:01:29