原创 Ubuntu12.10 内核源码外编译 linux模块--编译驱动模块的基本方法(上)

2015-1-29 15:11 1397 25 25 分类: MCU/ 嵌入式

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条评论)

登录后参与讨论
我要评论
0
25
关闭 站长推荐上一条 /2 下一条