Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530664
  • 博文数量: 101
  • 博客积分: 1889
  • 博客等级: 上尉
  • 技术积分: 906
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-14 16:22
文章分类

全部博文(101)

文章存档

2012年(11)

2011年(19)

2010年(59)

2009年(12)

我的朋友

分类: 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设备驱动的第一节课

阅读(2906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~