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的输出信息。
--
结束
现在静下来写点东西,主要一个目的是:为方便以后查阅,当然另一个目的也是给网上像我一样刚开始学习写 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的输出信息。
--
结束