在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙。高高大大的墙。。。
笔者在初探这一方向时,就在这2个问题上苦恼了很久。查阅无数资料,大多提到了一些问题的解决方案,但又与自己的情况略有不同而不能照搬。在无数次尝试之后最终成功编译了第一个arm架构的驱动模块。仅写此文给后来人一点帮助,提供一点思路。
由于笔者能力有限,资历尚浅,如果不足错误之处,望海涵并不吝赐教。
一.关于交叉编译环境及内核树的先后及关系
因为最终编译后的模块是运行在arm架构下,而开发板本身的计算能力不足,故需要在主机上安装交叉编译环境arm-linux-gcc来编译相关代码。
本帖中的内核树使用的源代码是适配mini2440开发板而进行修改后的linux系统代码,由开发板开发商提供
下载地址:http://www.arm9.net/mini2440-linux.asp
文件名:Linux 2.6.32.2 for mini2440/micro2440
该源代码在制作内核树的过程中需要使用到arm-linux-gcc等交叉编译工具,故而先配置交叉编译环境,后制作内核树。
笔者理解:内核树与你运行的宿主机之间没有太多关系。内核树的源代码需要与你使用的开发板的源代码相同。读者可根据自己情况到开发板的开发商官网下载,都会提供的。
二.交叉编译环境的安装及配置
首先下载交叉编译工具链,这里提供笔者使用的ARM-Linux
GCC 4.4.3
下载地址:http://www.arm9.net/mini2440-linux.asp
文件名:ARM-Linux
GCC
4.4.3
1.把arm-linux-gcc-4.4.3-20100728.tar.gz拷贝到任意文件夹下(这里文件名请不要照抄,根据实际情况使用tab补全,较熟悉的用户也不要吐槽笔者这么罗嗦,因为我就干过。。。后面不做赘述)
2.运行
$ sudo tar xvzf arm-linux-gcc-4.4.3-20100728.tar.gz -C
/解压该压缩包。这里需要注意的是-C使用大写C,且C后有空格,然后加/
这里-C的意思是改变解压路径
3.在/usr/local目录下建立arm路径
$ sudo mkdir
/usr/local/arm
将/opt/FriendlyARM/toolschain/4.4.3文件夹全部拷贝到/usr/local/arm下(/opt下的FriendlyARM正是从第二步中解压出来的。该压缩包直接把/opt打包的。)
$
sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
4.修改环境变量,把交叉编译器的路径加入到PATH
这里提供ubuntu的方法(莫吐槽。。。我用的虚拟机。。。莫骂我)
在/home/用户名/.bashrc文件最后添加
export
PATH=$PATH:/usr/local/arm/4.4.3/bin
然后运行
$ sudo source
/home/用户名/.bashrc
然后检查环境变量添加是否成功
$ echo
$PATH
查找是否已经将环境变量添加成功。
如果成功
运行
$ arm-linux-gcc
-v
查看是否输出arm-linux-gcc的版本号,
如果正确,交叉编译环境应该就安装完成了。
三.内核树的构建
在编译驱动模块的过程中,内核树是必不可缺的。四楼提供了本例中内核树构建的源代码,读者应按照自己的实际情况,去开发板的官网下载相应的源代码。
1.本例中讲源代码拷贝到/tmp/linux/下,
2.在/opt/FriendlyARM/目录下创建mini2440文件夹
$
sudo mkdir /opt/FridendlyARM/mini2440 并进入该目录
$ cd
/opt/FridendlyARM/mini2440
解压源代码
$tar
xvzf
/tmp/linux/linux-2.6.29-mini2440-20090331.tgz
3.配置编译文件
$ cd
/opt/FriendlyARM/mini2440/linux-2.6.29
$ cp config_mini2440_t35
.config
配置内核
$ make
menuconfig
选择Load an Alternate
Configuration
File
到这里编译内核树的准备工作还有最重要的一项。由于这里的内核是基于arm架构的,所以在编译的过程中需要使用到之前配置的交叉编译环境即arm-linux-gcc等。而内核源代码中的Makefile文件中的编译工具的地址需要修改为本机配置的具体地址。
4.makefile文件修改
在/opt/FriendlyARM/mini2440/linux-2.6.29下运行
$
sudo gedit ./Makefile
注意M为大写,编辑器你随意。。。
搜索arm-linux得到一个结果
CROSS_COMPILE?=
arm-linux-
然后搜索CROSS_COMPILE,找到
AS=
$(CROSS_COMPILE)as
LD=
$(CROSS_COMPILE)ld
CC=
$(CROSS_COMPILE)gcc
CPP= $(CC) -EAR=
$(CROSS_COMPILE)ar
NM=
$(CROSS_COMPILE)nm
STRIP=
$(CROSS_COMPILE)strip
OBJCOPY=
$(CROSS_COMPILE)objcopy
OBJDUMP=
$(CROSS_COMPILE)objdump
-------------------------------------------------------------
这里定义了交叉编译文件的位置本例中作如下修改
#AS=
$(CROSS_COMPILE)as
AS =
/usr/local/arm/4.4.3/bin/arm-linux-as
#LD=
$(CROSS_COMPILE)ld
LD =
/usr/local/arm/4.4.3/bin/arm-linux-ld
#CC=
$(CROSS_COMPILE)gcc
CC =
/usr/local/arm/4.4.3/bin/arm-linux-gcc
CPP= $(CC)
-E
#AR= $(CROSS_COMPILE)ar
AR =
/usr/local/arm/4.4.3/bin/arm-linux-ar
#NM=
$(CROSS_COMPILE)nm
NM =
/usr/local/arm/4.4.3/bin/arm-linux-nm
#STRIP=
$(CROSS_COMPILE)strip
STRIP =
/usr/local/arm/4.4.3/bin/arm-linux-strip
#OBJCOPY=
$(CROSS_COMPILE)objcopy
OBJCOPY =
/usr/local/arm/4.4.3/bin/arm-linux-objcopy
OBJDUMP=
$(CROSS_COMPILE)objdump
#OBJDUMP =
/usr/local/arm/4.4.3/bin/arm-linux-objdump
注意笔者对最后一项未作修改,至于原因嘛。。。。试出来的。。。。
到这里准备工作完成
5.编译
$ sudo make prepare
$
sudo make scripts
$ sudo
make
不出意料的话,到这里,内核树的编译也完成了。
四.关于驱动模块Makefile文件的编写
Makefile文件对于编译成功与否起到至关重要的作用。
在编译内核模块如驱动模块时需要制定内核为刚刚制作完成的内核树
obj-m:=s3c2440.o
CURRENT_PATH:=$(shell
pwd)
ARM_LINUX_KERNEL:=/opt/FriendlyARM/mini2440/linux-2.6.32.2
all:
$(MAKE)
-C $(ARM_LINUX_KERNEL) SUBDIRS=$(CURRENT_PATH) modulesclean:
rm
-rf *.cmd *.o *.ko *.mod.c *.symvers
*.order
上面的Makefile文件给大家一个参考。
第三行应该填写自己编译的内核树的具体位置,本例中为上文所写的内容。
五.最后
本例中许多命令需要使用root权限,请尽量sudo执行。如果与问题,请确认赋予了root权限。
本文参考了大量网络文献,不能一一列举,望作者见谅。有chinaUnix社区的大量美文。
本文中六楼第四步,即关于构建内核树过程中Makefile文件的修改系笔者原创,故而,关于这一部分的吐槽和赞美都嘲我来吧。
http://blog.csdn.net/sabalol/article/details/2076610
http://www.zhiwenweb.cn/Category/Learning/linux-ubuntu-Driver-Development-environment.html
上面两篇文章可能给你带来帮助。
完~
http://tieba.baidu.com/p/2055472114?see_lz=1
【基于mini2440开发板的交叉编译环境及内核树配置.,布布扣,bubuko.com
原文:http://www.cnblogs.com/cainiaoaixuexi/p/3668662.html