遇到的第一问题就是LDD3(Linux设备驱动程序 第三版)上所说的构建源代码树,我刚接触这个,并且对Linux的系统编程还不是太熟悉,不明白什么意思,从这本书上提供的地址上下载了书上源代码,看了看第一章的例子代码,不难,跟2.4的区别并不大,可编译方法改了,2.4可以直接使用gcc编译,现在必须使用Makefile了,至少我是这样认为的。make了一下,失败,根据提示信息看来是缺少内核源代码,由于我用的Linux并不是纯正的内核,是由开发商修改过的Linux发行版fc6,所以我不知道使用标准的内核是否可以,使用uname -a命令查看内核的版本是2.6.18-1,我从www.kernel.org上下了这个版本的源代码,回到例子代码处我修改了Makefile后我重新make,还是失败,提示缺少几个头文件,难道需要重新编译?好,make menuconfig,没做任何修改后保存退出,make,经过漫长的等待总算OK了,再次回到例子代码处,make,这次很顺利的就通过了,哦,原来内核源代码树就是编译后的内核源代码,兴致勃勃的insmod hello.ko!失败……,提示格式不正确,在看书的时候有提过版本依赖的问题,通过查看系统的日志,我发现原来是编译后的驱动版本和正在使用系统的版本不对,我的版本信息是:2.6.18-1,而需要的版本信息为2.6.18-1.2798.fc6 SMP xxxxxx,后面一大串,我又修改了标准内核的version.h这个文件,把里面的版本增加了一些,可编译后还是不支持,郁闷,在这个时候我习惯的打开GOOGLE,按错误提示进行搜索,看看又没有除了编译发行版内核以外的解决办法(因为我之前尝试编译过发行版的内核,可惜无法编译,而且源代码也找不到),我搜到fc6对内核开发的解决办法,就是yum install kernel-devel,通过下载和更新后,我把例子代码中的Makefile恢复到原始状态,再次make,成功,insmod hello.ko,成功,看看内核日志,hello world,HOHO。第一个在2.6上运行的驱动例子宣告成功。
高兴的时间不长,马上就出现了第二个问题,我的学习目标是嵌入式的驱动开发,当然最后驱动要应用到开发板中,在这之前我已经解决了我开发板内核的移植问题,现在使用nfs可以正常的驱动,内核版本为2.6.14,在做移植的时候我的内核已经编译过了,所以只要简单的修改下Makefile就可以重新编译hello.c,很顺利,编译成功,下载到板子上insmod,失败,提示无法检查内核版本,很是困惑,我又重新编译了板子的内核,增加一些对模块的支持,可还是不行,真是郁闷,继续Google。搜到一个大牛写的关于2.4和2.6驱动开发的区别,希望他能帮助我,我就写了一个mail发了过去(结果到现在也没回,我学习以来发了很多封mail,结果回信的寥寥无几),我还是继续测试,在源代码中增加对版本的说明,重新编译内核源代码树等等,最后还是不行,哎,看看板子上的系统都运行了那个模块吧,lsmod,失败!无法构建模块的表,这是怎么回事?我看了下busybox,0.1x的版本,貌似是太老了,好,我更新一下。我下了一个不算太新的版本,1.1.3,然后make menuconfig,把里面和模块有关的命令和支持全都选上,可能是我选太多了吧,第一次编译安装没有通过,我又去掉了一些,然后编译安装通过!尝试insmod hello.ko,成功!lsmod,看到了hello,哈哈,成功了。可shell出现了问题。乱七八糟的,不支持退格键,也不支持TAB,我又重新回到busybox的menuconfig,在shell里把有用的都选上了,这次编译安装后问题解决了。
经过了一个上午的忙活,总算是把LDD3所需要的环境搭建起来。
在继续学习的过程中发现发行版的内核代码还是缺少linux/config.h这个头文件,只要把标准里的cp过去就可以了。编译也能顺利进行。