Linux内核驱动模块编写(Hello,World)(2)

那么代码是很简单的,问题出现在编译上,网上很多人说要在编译的内核下编译,这个我不太懂,可能是编译后生成了我们所需要的文件?我是按照linux源代码Documention目录下面kbuild下的modules.txt和网上另一位仁兄的makefile写的,之前我很多人说用gcc -D__KERNEL__ -DMODULE -DLINUX -I{"你的linux源程序目录"} -c -o 这种编译的,结果错误一大堆,上网搜索,结果也没谁说出准确的解决方案,都是说自己解决,可我觉得这可能和不同的环境有关,很可能就是你的环境适合你的解决办法,为什么没人能够说出一种通用的解决办法。上面的办法貌似听说在2。4内核好用,我2.6还没搞明白,估计这东西在2.6上不适合吧。

那么还是采用2.6官方文档和网上成功编译人的方案,那就是写个Makefile,写好编译路径,以及模块编译后放置的路径。insmod貌似总从/lib/modues/目录下加载模块的,至于make工具如何保证我们编译的模块一定能够被正确加载,这个我暂时没研究,以后研究一下。

下面把Makefile文件贴出来

ifneq ($(KERNELRELEASE),)
obj
-m := {你要编译目标文件的名.o}
else
# modules所在目录
KERNELDIR :
= /lib/modules/`uname -r`/build
default:
        $(MAKE) 
-C $(KERNELDIR) M=`pwd` modules
endif

对于这段语句,说实话,我能明白,可不太知道为什么要if else 这么写,谁能解答一下?

写好之后,运行make,然后就会发现你当前目录多了很多文件,其中一个就是.ko文件,这个就是我们需要的。

好,现在运行insmod ./你的ko文件

网上很多人会说打出什么打印语句,结果我在控制台什么也没看见,后来才知道,这个需要用dmesg | tail命令来看

好像insmod打印重定向了??????

之后你在运行rmmod ./你的ko文件

OK , 大功告成。

说来,一个Hello,World模块书写真老费时间。。。。。。。。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwswyx.html