linux驱动开发环境的搭建

学习写 Linux 驱动 两周多了,但是一周的时间都在第一个 驱动 程序 上止步不前,damn it,Hello,World!!!总是编译不了。网上找了很多人的方法。都不行。终于一天make通过了,生成了.ko文件,但是insmod的时候又有别的问题:Invalid Modules format。后来在论坛里游荡了很久,终于找到答案了。

现在静下来写点东西,主要一个目的是:为方便以后查阅,当然另一个目的也是给网上像我一样刚开始学习写 Linux 驱动 的人一个参考。

首先,说说设备 驱动 开发的 环境 搭建 。现在资料上大概针对三种系统:RED HAT 9.0、Fedora和Ubuntu。Fedora大都是Fedora 9或者10以及以上,Ubuntu 8.04或者更高,Fedora和ubuntu的这两个版本的 Linux kernel 都在2.6以上。只有RED HAT 9.0这个古董级 Linux kernel是2.4。所以这里要区分一下。不管kernel是多少的,编译 驱动 都需要相应的 Linux 内核源代码。所以手头必须有份内核源代码,官网:www.kernel.org。

RED HAT 9.0在安装的时候要选择安装包,包括编程开发,内核开发等,当然如果安装的时候没安装这些必须的软件包的话,安装好后把cd1放进去可以再安装。安装好后,RED HAT 9.0的 环境 差不多就好了。和本机匹配的内核源码安装在/usr/src/下面了,比较身事,但是不得不说的是,由于 Linux 内核从2.4到2.6变化很大,所以个人感觉不要用这个 环境 学了,以后做东西应该都是2.6内核以上。下面给个Helloworld:

------------------------------------------
#include " linux /init.h"
#include " linux /module.h"

static int hello_init(void)
{
printk(Kern_ALERT "Hello World linux_driver_module/n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbey linux_driver_module/n");
}

module_init(hello_init);
module_exit(hello_exit);
------------------------------------------

Linux kernel 2.4在编译 驱动 的时候用下面的命令:

gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux2.4/include -c -o hello.o hello.c

这里-I后面跟的是你电脑上的内核源码存放的路径。

Fedora和RED HAT 9.0比较类似,安装的时候如果指定为开发的话,一般内核源码和 环境 都配置好了。下面讲讲ubuntu的配置。

个人感觉ubuntu是这几个发行版里做得很好的。所以喜欢他。但是开发 环境 搭建 还是要费点功夫的。其实也不是很难。但是开始的时候不熟悉,可能要走点弯路,甚至一度想放弃ubuntu。网上搜搜还是很容易解决的。

编译需要以下几个软件包:
build-essential,autoconf,automake1.9,cvs,subversion,kernel-package,libncurses5-dev
如果不确定你的电脑上是否安装了以上包,那就再重新安装一次又不会死。
所以:

sudo apt-get install build-essential autoconf automake1.9 cvs subversion kernel-package libncurses5-dev

网上有说bison flex最好要装,也不知道真的假的,最好还是装上吧:

sudo apt-get install bison flex

好的,现在已经把该装的开发包装好了,刚才说了,ubuntu刚装好系统里面是没有内核源代码的,所以需要自己动手下载,下载的内核源码最好和自己系统的版本一样。

step1:查看自己的内核版本:
uname -r

我的8。10是:2.6.27-7-generic

step2:查看你的sources.list源里的内核源码列表

apt-cache search linux -source

step3:下载内核源代码

sudo apt-get install linux -source-2.6.27

大概要50M,南邮的网络很好,我下载大概瞬间就好了,不到10秒。这里顺便提一句,自己的源配置好会节约很多很多的time。我的 sources.list在这里,可以作为参考,地方不一样源也不同。用点时间找找好源。源不好的话,下载这个文件慢的让你想去杀人.....

step4:解压下载的内核源代码

sudo tar jxvf linux -source-2.6.27.tar.bz2
(注意:这里我写的是自己的内核版本,你
要写你自己的版本,不要傻乎乎的跟着敲 ^_^)

step5:解压后,进入解压的内核源码目录里

cd /usr/src/ linux -source-2.6.27

然后配置文件:

sudo make oldconfig

step6:生成内核

sudo make

这一步时间很长,而且要注意:生成内核时保证你的硬盘空间最少有2G。我第一次make的时候就是硬盘空间不够了。哎,重装系统备呗,给ubuntu 20G的空间。我make后,发现少了3G!!!
等待......南京的天气不好,老是下雨,一下就好几天,哎.....去抽支烟,对不起我不会,劝你也赶快戒掉吧。抽烟有害健康,我说的不是对你的健康有害,是对周围的人的健康有害。跑题了.....等待.....

好了,终于make完了。

step7:编译模块,

make modules

step8:安装模块

make modules_install

到这ubuntu就基本上配置好了。下面给个经典的Hello,World

------------------------------------------
#include
#include
//MODULE_LICENCE("Dual BSD/GPL");


static int hello_init(void)
{
printk(KERN_ALERT "Hello World linux driver/n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbey linux driver/n");
}

module_init(hello_init);
module_exit(hello_exit);
------------------------------------------

开始的时候说了,RED HAT 9.0的 linux kernel 是2.4的,所以编译 驱动 要用

gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/src/linux2.4/include -c -o hello.o hello.c

但是2.6之后要用Makefile, 驱动 的后缀也从.o改为.ko,这里给出这个Hello,world的Makefile:

------------------------------------------
#Makefile 2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax dependency relationship of files and target modules are listed here.
mymodule-objs:=hello.o
obj-m:=hello.o
else
PWD:=$(shell pwd)
KVER?=$(shell uname -r)
KDIR:=/lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.com *.o *.mod.c *.ko .tmp_versions
endif
------------------------------------------

终端进入hello.c和Makefile的目录里,执行:

make

这时会在当前目录里生成很多.o .ko .tmp_versions .mod.c .com等文件。证明编译成功。
这里关注hello.ko文件,这就是 驱动 模块。

加载 驱动 ,加载.ko文件:

sudo insmod hello.ko

因为现在在虚拟终端加载的,所以内核打印的信息不会显示,而是写进了/proc/kmsg,要想看那个Hello,World的话,终端运行:

dmesg

这时会在会后看到那个:hello world linux driver。
可以查看是否加载了,终端运行:

lsmod

里面可以找到刚才加载的hello模块。

卸载 驱动

sudo rmmod hello

这时如果输入:dmesg的话,可以看到最后有:Goodbey linux driver的输出信息。
--
Logo

更多推荐