3.1 Linux 驱动模块的编写之模块框架
1、Makefile
1 #obj-m :=demo1.o 2 obj-m :=demo2.o 3 4 #KERNEL :=/lib/modules/`uname -r`/build/ #PC端 5 KERNEL :=/linux-3.5 6 7 all: 8 make -C $(KERNEL) M=`pwd` 9 clean: 10 make -C $(KERNEL) M=`pwd` clean
demo1.c & demo2.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 static int __init demo_init(void)//__init表示执行完内核会自动回收模块入口占用的空间和相关临时数据占用的空间 5 { 6 printk("<0>hello,kernel!\n"); 7 return 0; 8 } 9 10 static void __exit demo_exit(void) 11 { 12 printk("<0>bye,kernel!\n"); 13 } 14 15 16 module_init(demo_init); 17 module_exit(demo_exit); 18 19 MODULE_LICENSE("GPL"); 20 MODULE_AUTHOR("crmn"); 21 MODULE_VERSION("crmn1.0"); 22 MODULE_DESCRIPTION("this is a demo!");





遇到点小问题!!!

现在的内核模块在插入卸载时都会要转到 “/lib/modules/内核版本号/ ” 这个目录里。所以只要建立这个目录就行了。
2.Makefile
1 obj-m := new.o 2 new-objs := demo.o debug.o 3 4 KERNEL :=/linux-3.5 5 #KERNEL :=/lib/modules/`uname -r`/build/ #PC机源码目录路径 6 7 all: 8 make -C $(KERNEL) M=`pwd` 9 clean: 10 make -C $(KERNEL) M=`pwd` clean
demo.c
1 /*2017.3.7*/ 2 #include <linux/init.h> 3 #include <linux/module.h> 4 5 extern void debug(int); 6 //驱动函数入口 7 static int __init demo_init(void)//加 __init 表示执行完内核会回收入口占用的空间和相关临时数据占用的空间 8 { 9 debug(1); 10 11 printk("<0>hello,kernel!\n"); 12 13 debug(2); 14 return 0; 15 } 16 17 //驱动函数出口 18 static void __exit demo_exit(void)//加 __exit 19 { 20 printk("<0>bye,kernel!\n"); 21 } 22 23 module_init(demo_init);//入口,内核一个宏,可自己设定 24 module_exit(demo_exit);//出口,内核一个宏 25 26 MODULE_LICENSE("GPL"); 27 MODULE_AUTHOR("crmn"); 28 MODULE_VERSION("crmn1.0"); 29 MODULE_DESCRIPTION("this is a demo");
debug.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 void debug(int num) 5 { 6 printk("hello , debug~~~~~ %d!~~~~~\n",num); 7 }


3、Makefile
1 obj-m :=new.o 2 new-objs:=demo1.o debug.o 3 4 obj-m +=demo2.o 5 KERNEL :=/linux-3.5 6 7 all: 8 make -C $(KERNEL) M=`pwd` 9 clean: 10 make -C $(KERNEL) M=`pwd` clean
demo1.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 extern void debug(int); 5 6 static int var = 200; 7 EXPORT_SYMBOL_GPL(var);//符号导出,另一工程可使用此变量 8 9 static int __init demo_init(void)//__init表示执行完内核会自动回收模块入口占用的空间和相关临时数据占用的空间 10 { 11 debug(1); 12 printk("%s:var = %d\n",__func__,var); 13 debug(2); 14 return 0; 15 } 16 17 static void __exit demo_exit(void) 18 { 19 printk("<0>bye,kernel!\n"); 20 } 21 22 23 module_init(demo_init); 24 module_exit(demo_exit); 25 26 MODULE_LICENSE("GPL"); 27 MODULE_AUTHOR("crmn"); 28 MODULE_VERSION("crmn1.0"); 29 MODULE_DESCRIPTION("this is a demo!");
demo2.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 extern int var; 5 extern void debug(int); 6 static int __init demo_init(void)//__init表示执行完内核会自动回收模块入口占用的空间和相关临时数据占用的空间 7 { 8 debug(222); 9 var = 222; 10 printk("in %s:var = %d\n",__func__,var); 11 return 0; 12 } 13 14 static void __exit demo_exit(void) 15 { 16 printk("<0>bye,kernel!\n"); 17 } 18 19 20 module_init(demo_init); 21 module_exit(demo_exit); 22 23 MODULE_LICENSE("GPL"); 24 MODULE_AUTHOR("crmn"); 25 MODULE_VERSION("crmn1.0"); 26 MODULE_DESCRIPTION("this is a demo!");
debug.c
1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 void debug(int num) 5 { 6 printk("hello, debug!~~~~~~%d~~~~~~~\n",num); 7 } 8 9 EXPORT_SYMBOL_GPL(debug);
//有依赖,必须按顺序执行



//demo.c加了消息等级
![]()
![]()
浙公网安备 33010602011771号