3、使用kbuild进行模块编译:
基本方法可以参考: http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt
核心思想是,通过-C指明系统上的内核体系路径,通过M=指明模块源文件路径,然后自己构造一个makefile文件,从而实现编译过程。
3.1 构建适用于kbuild方法的makefile:
obj-m := hello.o all : $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
开始make:
$make make -C /lib/modules/3.5.0-17-generic/build M=/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic' scripts/Makefile.build:44: /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/Makefile: No such file or directory make[2]: *** No rule to make target `/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/Makefile'. Stop. make[1]: *** [_module_/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic' make: *** [all] Error 2
自动使用了当前运行中的内核,构建对应的模块,但是提示找不到Makefile,而该目录下的文件为makefile,所以尝试修改名字:
$mv makefile Makefile
特别注意,要使用Makefile才行!不能时makefile;
修改后,编译成功:
$make make -C /lib/modules/3.5.0-17-generic/build M=/media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic' Building modules, stage 2. MODPOST 1 modules # 说明成功编译了一个模块 make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic'
3.2 加载和删除内核模块:
$sudo insmod ./hello.ko #加载 $sudo rmmod hello #删除
并没有看到源代码中的输出信息,查看系统相应日志即可:
$tail /var/log/kern.log # 注意ubuntu下的日志路径 Oct 23 22:22:22 qunengrong-Studio-1450 kernel: [43021.773888] Hello kernel, it's 2012! Oct 23 22:22:37 qunengrong-Studio-1450 kernel: [43037.092339] Bye, kernel!
至此,我们已经可以成功编译和加载内核模块了;
4、额外成就,要注意模块与内核版本的匹配:
假设我直接使用另一个内核体系进行构建,比如3.5.0-15-generic,但是当前系统运行的为3.5.0-17-generic的内核,则加载时报错,如下:
$make -C /lib/modules/3.5.0-15-generic/build M=`pwd` modules make: Entering directory `/usr/src/linux-headers-3.5.0-15-generic' CC [M] /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.o /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.c:16:5: warning: function declaration isn’t a prototype /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.c:23:6: warning: function declaration isn’t a prototype Building modules, stage 2. MODPOST 1 modules CC /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.mod.o LD [M] /media/GoldenResources/arm/ARM高级班/内核第一天/实验代码/HelloWorld/hello/hello.ko make: Leaving directory `/usr/src/linux-headers-3.5.0-15-generic' $sudo insmod ./hello.ko # 版本不一致报错 insmod: error inserting './hello.ko': -1 Invalid module format
由此可见,使用自动构建带来的方便,将该通用Makefile分享如下:
obj-m := name.o all : $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
作者:逸云沙鸥
出处:http://www.cnblogs.com/QuLory/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
文章评论(0条评论)
登录后参与讨论