在看<Linux Device Driver Third Edition>的时候,作者其中提到Setting Up Your Test System。他只是指出为2.6.X编写模块,首先,要求你在Linux系统上构建和配置内核树,对于2.6版本的内核来说,已有的头文件已经足够了,但是2.6的模块链接着内核源码树中的对象文件。这样模块加载器将更健壮,但是也要求这些对象文件存在。所以驱动开发的第一件事情就是构建内核源码树。
他没有提到如何构建,我从网上找了一些资料,构建了自己的内核树,写出来大家分享一下,本人用的是Ubuntu Linux 10.10 装在虚拟机里面,要求你的虚拟机硬盘容量最少不低于10G,本人10G,仍有提示硬盘容量不够,但是还是完成了内核树的构建,15G硬盘容量应该够了。
首先查看自己的linux内核的版本,在终端中输入: uname -r
可以看到自己的内核版本,我的内核版本为:2.6.35-22-generic
然后进入 usr/src/下查看是否有linux-source 文件,一般是没有的,至少我的ubuntu没有
没有就去网上查找,在终端中输入: apt-cache search linux-source
可以看到结果:
linux-source - Linux kernel source with Ubuntu patches
linux-source-2.6.35 - Linux kernel source for version 2.6.35 with Ubuntu patches
选择同自己内核相应的linux-source版本安装。具体的安装方法为,在终端中输入:
sudo apt-get install linux-source-2.6.35
下载完毕后在/usr/src/下有个名为linux-source-2.6.35 的文件夹,在该文件夹里面有linux-source-2.6.35.tar.bz2 ,解压到/usr/src/linux-source-2.6.35/目录下。
解压方法,在终端中输入: sudo -i 切换到根用户下,定位到/usr/src/linux-source-2.6.35/目录下,在终端中输入:tar jxvf linux-source-2.6.35.tar.bz2
解压得到文件源代码文件,该源代码文件夹名称为linux-source-2.6.35,进入该目录,注意此时在终端中应该是这样的:
root@jk1860-machine:/usr/src/linux-source-2.6.35/linux-source-2.6.35#
因为解压出来的源代码文件夹位于linux-source-2.6.35下,所以有两层。
开始配置内核,选择最快的原版的配置(默认)方式:在终端中输入:make oldconfig
完成后,先去配置/usr/src/linux-source-2.6.32/linux-source-2.6.35/ubuntu/omnibook/Makefile文件。
不然会出现ld: /ubuntu/omnibook/sections.lds: No such file: No such file or directory错误
在根用户下打开该Makefile文件,将其中的PWD=$(shell pwd)剪切到ifeq ($(KERNELRELEASE),) 前面。然后保存。
然后编译模块,定位到源代码文件夹下,在终端中输入: make modules
等待将近1个小时,该编译完成。完成之后,安装模块,在终端中输入:make modules_install
至此,源码树构建完成,重启系统,
将《Linux Device Driver Third Edition》中的第一个例子运行下吧。
文中代码:helloworld.c
Makefile文件内容:
编译,在终端中输入:make
然后加载模块 (root用户)
root@jk1860-machine:/home/shana/Driver# insmod ./helloworld.ko
按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)
root@jk1860-machine:/home/shana/Driver# insmod ./helloworld.ko
查看加载模块
root@jk1860-machine:/home/shana/Driver# lsmod
Module Size Used by
helloworld 2560 0
删除模块
root@jk1860-machine:/home/shana/Driver# rmmod helloworld
书中说明,如果不出现在终端,则会写进 syslog 文件中
root@jk1860-machine:~# cat /var/log/syslog |grep world
Jan 20 10:21:23 jk1860-machine kernel: [ 1683.984471] hello world
Jan 20 10:22:35 jk1860-machine kernel: [ 1755.752461] Goodbye, cruel world
驱动开发环境搭建完成。
可以参考http://blogold.chinaunix.net/u2/81217/showart_1330300.html
本文有借鉴和抄袭其中的内容