linux设备驱动论坛,linux设备驱动开发环境搭建 (amoBBS 阿莫电子论坛)

本文介绍了在Ubuntu 10.04 LTS环境下,如何构建2.6.32内核源码树,并基于此编写一个简单的Hello World内核驱动程序。首先下载内核源码,配置并编译,然后创建驱动程序的hello.c文件和Makefile,最后编译生成驱动模块hello.ko并加载到系统中,通过dmesg查看驱动运行结果。
摘要由CSDN通过智能技术生成

<>(Linux Device Driver,简称LDD) 一书是linux驱动程序开发的经典,这里阐述的是怎么编写一个 hello 的内核驱动程序。

配置的环境和程序对应 LDD 第二章的内容。

我的系统是 ubuntu 10.04 LTS,对应的内核是 2.6.32-38-generic

要开发驱动程序,则必须先构造你运行的环境的内核树,例如我的系统内核是 2.6.32-38-generic ,而写好的驱动程序我想就在本机上运行,那么久需要构造一个 2.6.32 的内核树了,否则运行的时候就提示版本不对了。

网上有一篇文章叫 “Ubuntu 下构造内核源码树” 写得挺好,我就是按照上面的来做。

依赖的包,因为我的系统是用来开发用的,所以已经安装了很多包,这次编译内核树是直接一次成功的,并没有需要额外安装的包,一般来说 ncurse 和 build-essential 是必要要的,因为 menuconfig 工具就是基于 ncurse 开发的。build-essential 则包含了基本的编译需要工具

# apt-get install libncurses-dev build-essential

1. 进入root工作 :-)

2. 下载内核树,大概80M 内核源代码一般放在 /usr/src 里面,解压缩并进入该目录

3. 配置,当然用现成的配置文件,menuconfig 装载一下现在的配置就行了。

4. 编译源码树,要编译才能用的

$ su root

# apt-get install linux-source-2.6.32

# cd /usr/src

# tar xjf linux-source-2.6.32.tar.bz2

# cd linux-source-2.6.32

# cp ../linux-headers-2.6.32-38-generic/.config .

# make menuconfig

# make -j2

最后的make参数 -j2 是启用了2个任务同时编译,因为我的是双核系统,这样会快至少三分一的,不过这是系统会很卡,因为两个核心都 100% 的在工作了,不过好处是编译时间大幅度减少。我的系统是编译内核大概 20分钟。如果一切正常的话,则可以开始编写驱动,我们写hello world驱动

进入工作目录,例如我的是

# cd /mini2440/driver

创建 hello.c 内容如下:其实就是LDD第二章的内容,照抄就行了。

#include

#include

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)

{

printk(KERN_ALERT "Hello, world\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "Goodbye,cruel world\n");

}

module_init(hello_init);

module_exit(hello_exit);

接着需要Makefile,其实在 LDD 的P28-29 页已经是有介绍的了。如果你是第一次写 Makefile的话则需要注意了,命令的开始一定是要 Tab 比如说这里的 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 命令的开始就必须是一个 Tab ,而不可以是空格,Tab 是指键盘上字母Q左边的那个按键。因为我的代码贴到网上的时候很可能 Tab 变成了空格符号,也就出错了,想当年我开始的时候不懂复制人家网上的代码后死活不行,折腾了好一番。

LDD 里面已经有解释的了,我也多说一句,obj-m 是内核里面使用的符号,所以在这里看不到任何的关联,其实是传递到内核树里面,他就懂的了,然后设置内核源码树,也就是上面构造的那棵树的位置,PWD 是当前的目录,$(MAKE) -C 是指进入到某个目录执行该目录下的Make 命令的意思,在这里的意思是,跳转到内核树的目录,执行make指令,然后 M 表示构造完之后返回当前目录。

obj-m := hello.o

KERNELDIR ?= /usr/src/linux-source-2.6.32

PWD := $(shell pwd)

all:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

一切正常的话生成 hello.ko ,这个就是驱动模块的,只需要加载进系统。

# insmod ./hello.ko

# rmmod hello

前一个命令是加载驱动,后一个是去除驱动,如果是在 ubuntu 的话,可以通过查看系统log 来查看结果,

# dmesg

看到一堆记录,最后的两个就是我们的驱动程序工作

[ 4814.679760] Hello, world

[ 4823.680729] Goodbye,cruel world

接着就可以根据 LDD 继续学习了,至少环境是搞好了,如果是嵌入式linux的驱动程序,其实原理一样的,首先要构造源码树,开发板上面的linux的内核是什么,就用那个作为源码树,因为开发的驱动最终是用在他上面的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值