分类: LINUX
2010-11-26 16:18:30
//这篇文章是基于x86的,如果基于arm很多操作是不同的
首先,请根据自己的内核版本下载相应的源代码包。
确定自己的内核版本的方法:
[root@localhost /]# uname -rm
接着,请按照以下步骤一步步进行,其中MyDir代表内核源代码包的存储位置,请依据自己的情况而定。黑底的文字代表当前命令执行结果。
[root@localhost MyDir]# rpm –Uvh kernel-2.6.15-1.2054_FC5.src.rpm
注:其中,kernel-2.6.15-1.2054_FC5.src.rpm是我的内核版本对应的源代码包。
[root@localhost MyDir]# cd /usr/src/redhat/SPECS
[root@localhost SPECS]# rpmbuild -bp --target $(uname -m) kernel-2.6.spec
[root@localhost SPECS]# ls /usr/src/redhat/BUILD/kernel-2.6.15/
Config.mk linux-2.6.15.i686 vanilla xen xen-vanilla
[root@localhost SPECS]# cd /usr/src
[root@localhost src]# mkdir kernels
[root@localhost src]# cd kernels/
[root@localhost kernels]# ln -s ../redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686/ 2.6.15-1.2054_FC5-i686
注:ln是小写的LN(非in),而不是大写的In。
另注: 处有个空格,无空格无法编译以下步骤。
[root@localhost kernels]# ls
2.6.15-1.2054_FC5-i686
[root@localhost kernels]# cd 2.6.15-1.2054_FC5-i686/
[root@localhost 2.6.15-1.2054_FC5-i686]# cp configs/kernel-2.6.15-i686.config .config
cp:是否覆盖".config" ? y
注:输入y以确认覆盖。
[root@localhost 2.6.15-1.2054_FC5-i686]# uname –r
接下来,请修改Makefile中的内容:
把
EXTRAVERSION = -prep
换成
EXTRAVERSION = -1.2054_FC5
然后继续编译:
[root@localhost 2.6.15-1.2054_FC5-i686]# make mrproper
[root@localhost 2.6.15-1.2054_FC5-i686]# make oldconfig
[root@localhost 2.6.15-1.2054_FC5-i686]# make
注:这一步需要花挺长的时间,我将近花了50分钟。
[root@localhost 2.6.15-1.2054_FC5-i686]# make modules_install
至此,内核源代码树编译完成。
接下来,利用ldd3中的第一个设备驱动例子(hello.c)进行测试刚才编译过的内核。
注:hello.c及Makefile的文件内容请参见我之前的文章《Linux设备驱动初体验——The Hello World Module》。
[root@localhost MyDir]# make
make -C /lib/modules/2.6.15-1.2054_FC5/build M=/MyDir modules
make[1]: Entering directory `/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686'
CC [M] /MyDir/hello.o
Building modules, stage 2.
MODPOST
CC /MyDir/hello.mod.o
LD [M] /MyDir/hello.ko
make[1]: Leaving directory `/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686'
查看make之后的结果:
[root@localhost MyDir]# ls
hello.c hello.ko hello.mod.c hello.mod.o hello.o
嗯,make成功,赶紧利用insmod命令装载模块驱动:
[root@localhost MyDir]# insmod ./hello.ko
咦?没有反应?不甘心,再来一次
[root@localhost MyDir]# insmod ./hello.ko
出现了错误:
insmod: error inserting './hello.ko': -1 File exists
怎么会呢?网络上狂搜答案,发现了一条有用的答复(在此谢谢知道这个答案并把它发布的网友们):
在图形界面下无法看到装载结果,必须切换到文本界面。
于是,切换到文本界面,继续装载:
[root@localhost MyDir]# insmod ./hello.ko
可还是同一个错误!!对着黑兮兮的屏幕,苦思冥想,冥思苦想...........
N个...之后,猛然发现,insmod ./hello.ko使用过一次,却还没把它卸载掉,于是使用rmmod命令试试:
[root@localhost MyDir]# rmmod hello.ko
终于看到了卸载结果:
Goodbye,cruel world
于是再重新装载试试,终于也看到了装载结果:
Hello, world
到此,终于完成了Linux设备驱动的第一节课