1、先编写一个简单的hello模块,hello.c 源码如下:
1 #ifndef __KERNEL__ 2 # define __KERNEL__ 3 #endif 4 #ifndef MODULE 5 # define MODULE 6 #endif 7 8 // 下面的是主要的内容 9 #include 10 #include 11 #include 12 13 MODULE_LICENSE("GPL"); 14 15 static int year=2012; 16 17 int hello_init() 18 { 19 printk(KERN_WARNING "Hello kernel, it's %d!\n",year); 20 return 0; 21 } 22 23 24 void hello_exit() 25 { 26 printk("Bye, kernel!\n"); 27 } 28 29 // 下面两个为关键的模块函数 30 module_init(hello_init); 31 module_exit(hello_exit);
如果上面的代码看起来不太熟悉,那么需要查看以下相关的书籍,比如《Linux设备驱动程序,第三版》,也就是大名鼎鼎的LDD;
2、老式驱动模块编译方法:
直接写出make规则到makefile文件中,引用内核体系的头文件路径,举例如下:
1 # The path of kernel source code 2 INCLUDEDIR = /media/GoldenResources/linux/linux-2.6.30/include 3 4 # Compiler 5 CC = gcc 6 7 # Options 8 CFLAGS = -D__KERNEL__ -DMODULE -O -Wall -I$(INCLUDEDIR) 9 10 # Target 11 OBJS = hello.o 12 13 all: $(OBJS) 14 15 $(OBJS): hello.c 16 $(CC) $(CFLAGS) -c $< 17 18 install: 19 insmod $(OBJS) 20 21 uninstall: 22 rmmod hello 23 24 .PHONY: clean 25 clean: 26 rm -f *.o
这里有我是用的一个linux内核源代码路径:/media/GoldenResources/linux/linux-2.6.30/include ,注意设置到正确的源码路径。
尝试这编译:
$make gcc -D__KERNEL__ -DMODULE -O -Wall -I/media/GoldenResources/linux/linux-2.6.30/include -c hello.c In file included from /media/GoldenResources/linux/linux-2.6.30/include/linux/kernel.h:11:0, from hello.c:8: /media/GoldenResources/linux/linux-2.6.30/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory compilation terminated. make: *** [hello.o] Error 1
出现错误: include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory , 网上查阅相关资料后,找到不错的说明:
请查看:http://stackoverflow.com/questions/9492559/module-compiling-asm-linkage-h-file-not-found
主要意思是这种编译方法不能很好的解决相关的依赖体系,主要是源于历史原因,linux内核升级很快,越来越复杂,所以建议使用kbuild体系来自动完成;故下面采用了可行的kbuild体系来完成。
文章评论(0条评论)
登录后参与讨论