接触linux驱动开发有一段时间了,一直都没有好好回顾下自己的学习过程,现在觉得非常有必要将自己的学习
经历和过程表述出来,一来主要让自己理顺下学习的每一阶段的总结,二来也有可能能帮助到尚未接触到linux
驱动开放但总要接触到这个领域的筒子,在这里希望能与他们共勉!好,下面开始我的菜鸟制作
这些年接触了好几种编程语言,都有这么一个体会,上来二话不说先把经典的hello world 跑起来!相信各位也
是这样的,但其实要跑起 helloworld 也是经历了好些过过程的:
1:环境的搭建和配置
2:hello world 程序的编写
3:使用编译命令编译,最后执行
那在这里我也按照这个顺序来开始我们的linux嵌入式(这里的嵌入式设备以arm 6410为例)驱动编程:
首先是环境搭建, 环境包括交叉编译器和linux内核树,还有开放板。我这里是基于arm平台的开放,
所以交叉编译器是arm-linux-gcc, 安装交叉编译器需要下载其工具包 arm-linux-gcc-x.x.x.tar.bz2,使用命令
tar -xvf arm-linux-gcc-x.x.x-tar.bz2 -C /usr/local/arm/ 把编译器工具解压到环境目录下,在把工具包bin路径
加入到 $PATH环境变量里,编辑~/.bash_profile,在最后加入一行 PATH=/uar/local/arm/bin:$PATH ,然后
执行命令 source ~/.bash_profile ,这样就可直接使用 arm-linux-gcc 工具了!
接下来就是构建linux内核树,这个其实就是下载linux内核的某个主线源码包(这里以linux-2.6.28版本
为例) linux-x.x.x.tar.bz2同样使用命令 tar -xvf linux-x.x.x-tar.bz2 解压,解压完成后进入linux-x.x.x 目录,
执行命令 make zImage 开始编译,当然执行这步之前视平台不同要修改Makefile的一些配置,这里修改两处:
ARCH:= arm
CROSS_COMPILE:= arm-linux-
编译结束也就是内核树构建完成!好到此为止,最复杂的环境搭建已经完成!
接下来就是hello world程序的编写,以下是源码 hello.c:
#include <linux/init.h>
#include <linux/module.h>
static int __initi hello_init(void)
{
printk("hello kernel .\n");
return 0;
}
static void __exit hello_exit(void)
{
printk("bye bye .\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
最后制定编译规则,即编写Makefile,其代码如下:
obj-m := hello.o
KERN = /usr/src/linux-2.6.28/ #内核树目录
all:
make -C $(KERN) M=`pwd` modules
clean:
make -C $(KERN) M=`pwd` modules clean
接下来就是执行编译 make ,当前目录就会生成hello.ko, 到开放板插入模块,执行 insmod hello.ko
就能得到结果
hello kernel
删除模块 rmmod hello (这里不用加.ko)结果是
byebye
到这里,我们的环境搭建和hello world 开放完成!