收藏 分享(赏)

交叉编译ARM Linux内核.doc

上传人:HR专家 文档编号:11561565 上传时间:2020-06-24 格式:DOC 页数:7 大小:110.50KB
下载 相关 举报
交叉编译ARM Linux内核.doc_第1页
第1页 / 共7页
交叉编译ARM Linux内核.doc_第2页
第2页 / 共7页
交叉编译ARM Linux内核.doc_第3页
第3页 / 共7页
交叉编译ARM Linux内核.doc_第4页
第4页 / 共7页
交叉编译ARM Linux内核.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、交叉编译ARM Linux内核姚强,郭彩霞(重庆信息技术职业学院,电子工程学院,重庆市万州区 404000)摘 要:以Linux操作系统环境为例,介绍如何在Linux操作系统下建立嵌入式交叉编译环境,和如何使用交叉编译工具完成嵌入式Linux内核的交叉编译。在ARM Linux内核交叉编译部分以S3C2410X目标机处理器,最终生成了可在其上运行的Linux内核,内核版本为Linux-2.6.34。关键词:交叉编译; ARM; Linux内核; S3C2410XCross compile ARM Linux kernelYAO Qiang, GUO Cai-xia(Institute of S

2、oftware, Chongqing Information Technology College, Wanzhou, Chongqing 404000 China)Abstract: The article described how to build an embedded cross-compiler environment, and how to use the cross-compil- er tools to cross compile the embedded Linux Kernel in Linux Operation system. In the section of cr

3、oss compile ARM Linux kernel, S3C2410X was as an example of target machine processors, and the version is 2.6.34. Finally, a runable ARM Linux Kernel for S3C2410X was generated.Key words: cross compile; ARM; Linux kernel; S3C2410X1 相关背景介绍嵌入式系统已广泛应用于各个科技领域和日常生活,由于其本身的特性,使得我们很难发现它的存在。嵌入式系统是以应用为核心,以计算机

4、技术为基础,软硬件可裁剪,对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统。在当前数字信息技术和网络技术高速发展的后PC时代,嵌入式系统已经渗透到各个领域。现在,嵌入式技术无处不在,而ARM几乎成了嵌入式的代名词。1.1 ARM简介ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类处理器的通称,还可以认为是一种技术的名字1。1990年11月正式成立以来,在32位RISC(Reduced Instruction Set Computer,精简指令集计算机)CPU开发领域中不断取得突破。ARM作为IP(Intelligence Prop

5、erty,知识产权)供应商,靠转让许可,由伙伴公司来生产各具特色的芯片。其设计的芯核具有低功耗、低成本等显著优点,获得众多的半导体厂家和整机厂商的大力支持。在全球,ARM的合作伙伴超过100家,在32位嵌入式应用领域获得了巨大的成功。鉴于ARM微处理器在国内的逐步推广应用,很多大学已开设基于ARM的32位微处理器相关课程。我校相关专业从09级开始,也将开设基于ARM的嵌入式相关课程。1.2 嵌入式操作系统简介和通用计算机系统一样,在嵌入式系统中,也是由操作系统负责全部软、硬件资源的分配、调度、控制和协调,这种操作系统统称为嵌入式操作系统。嵌入式操作系统必须体现其所在系统的特征,能够通过加载/卸

6、载某些模块来达到系统所要求的功能。常见的嵌入式操作系统有:uC/OS II、uCLinux、ARM -Linux、VxWorks、PalmOS、Windows CE 、Windows XP Embedded、Windows Vista Embedded、嵌入式Linux、Symbian等。在嵌入式操作系统中,目前最为流行的一款就是开放源代码的操作系统Linux。Linux不仅在PC平台上被广泛运用,还在嵌入式应用中大放光彩。目前正在开发的嵌入式系统中,70%以上的项目选择Linux作为操作系统。1.3 S3C2410X简介 S3C2410X微处理器是一款由samsung公司为手持设备设计的低功

7、耗、高集成度的基于ARM920T核的微处理器2。为了降低系统总成本和减少外围器件,这款芯片还集成了16KB指令Cache、16KB数据Cache、MMU、外部存储器控制器、LCD控制器、NAND FLASH控制器、4个DMA通道等部件。目前S3C2410X被广泛应用于PDA、移动通信、路由器、工业控制等领域。其内部结构如图1所示。 图1 S3C2410X结构框图2 建立ARM -Linux交叉编译环境交叉编译是指在一个平台上利用交叉编译工具生成另一个平台上的可执行代码。这里的平台,包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可

8、以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。例如, x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的简称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。2.1 交叉编译的目的 采用交叉编译的主要原因在于,多数嵌入式目标机不能提供足够的资源供编译过程使用,因而只好将编译工作转移到高性能的宿主机(嵌入式软件开发环境和编译环境所在平台,通常是基X86的PC机)中进行。其目的是利用宿主机丰富的资源完成嵌入式嵌入式软件的编译工作,产生可以在特定嵌入式平台上运行的程序

9、代码。另外,有时目标机还没有建立,还没有操作系统,更谈不上运行编译器,这时也需要建立交叉编译环境。2.2 准备工作交叉编译器是一个由编译器、连接器和解释器组成的综合编译环境1。在建立交叉编译环境之前要先做好准备工作。首先,要准备好宿主机平台,建议采用x86 Linux做宿主机平台,因为采用这种平台需要的设置工作很少。其次,要准备构建交叉编译器需要的软件包。交叉编译器可以通过编译源代码来自己生成,也可以直接从网上下载现成的工具。自己编译生成交叉编译器,必须先做以下准备:1、宿主机可用磁盘空间要500M以上。 2、下载所需要的源代码。主要包括binutils、gcc、linux、glibc、gli

10、bc-linuxthreads的源代码。其中binutils包含链接器、 汇编编译器等工具,gcc是GUN C/C+编译器,glibc是GNU的C语音库,linux是Linux内核源代码,glibc-linuxthreads提供Linux线程库。在下载这些源代码时尽量使用较新的版本,还要注意,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致。这里使用的源代码如下: Binutils选择Binutils-2.14.tar.bz2; Gcc选择gcc-3.3.2.tar.bz2; Glibc选择glibc-2.2.5.tar.bz2; Glibc-linuxthreads选择gli

11、bc-linuxthreads-2.2.5.tar.bz2; Linux内核选择Linux2.6.34。最后,准备相关的目录,这些目录最好是在当前用户的家目录。首先,在家目录下创建/cross目录,然后在/cross目录下创建source、patches、Linux-2.6.34三个子目录。如果使用现成的交叉编译工具,则只用下载整合的交叉编译包。2.3 构建交叉编译环境2.3.1 自己编译构建交叉编译环境自己编译构建交叉编译器遵循以下步骤3:1)编译binutils;2)初次编译gcc; 3)编译glibc; 4)完整编译gcc第一步,编译binutils在宿主机操作系统中打开终端,在终端中依

12、次执行下列命令:cd /cross /切换到cross目录下 tar jxvf ./source/binutils-2.14.tar.bz2 /解压binutils压缩包 cd binutils-2.14 mkdir arm-linux /创建arm-linux常用工具链目录cd arm-linux ./configure target=arm-linux prefix=/usr/local/arm/3.3.2 /生成binutils的Makefile文件,target指明交叉编译的目标板体系结构,prefix指明编译完成后的安装目录。make /编译binutils源代码make insta

13、ll /安装这一步完成之后,编译出来的工具安装在/usr/local/arm/3.3.2/bin目录下。为了以后能够在终端中直接使用这些工具,可在/etc/profile、/.bash_profile、/.bashrc三个文件中的任何一个里面添加以下代码来修改PATH环境变量。PATH=$PATH:/usr/local/arm/3.3.2/bin 第二步,初次编译gccgcc的编译分两次。由于此时还没有编译glibc,因此还不能完整地编译gcc,但glibc的编译又离不开gcc,因此,在这里需要首先编译一个具备最基本功能的gcc,在编译完glibc之后再完整编译gcc。初次编译gcc可按以下步

14、骤进行。首先,在终端中执行以下命令:cd /cross tar jxvf ./source/gcc-3.3.2.tar.bz2 cd gcc-3.3.2然后,使用文本编辑工具打开gcc/config/t-linux这个配置文件,在文件中第一行代码的最后添加-Dinhibit_libc D_gthr _posix.h,在#INSTALL_LIBGCC = install-multilib这一行后另起一行,添加T_CFLAGS = -Dinhibit_libc D_gthr_posix.h,使后面的编译过程不编译libc和gthr_posix.h文件。最后,编译gcc。在终端中执行以下命令:mkd

15、ir arm-linux /创建arm-linux常用工具链目录cd arm-linux ./configure target=arm-linux prefix=/usr/local/arm/3.3.2 -with-header=/cross/Linux-2.6.34/include -disable-shared disable-threads enable-languages=”c” / target指明交叉编译的目标板体系结构,prefix指明编译完成后的安装目录,disable-shared指定不依赖共享库,disable-threads指定不使用线程,enable-languages

16、指定仅支持C语言。第三步,编译glibc 编译glibc与前面两步类似,可在命令行执行下列命令:tar zxvf /cross/source/glibc-2.2.5.tar.gz cd glibc-2.2.5 tar zxvf /cross/source/glibc-linuxthreads-2.2.5.tar.gz 注意,要把linuxthreads解压到 glibc目录里。mkdir arm-linux cd arm-linux CC=arm-linux-gcc AS=arm-linux-as LD=arm-linux-ld ./configure host=arm-linux -with

17、-headers=/cross/Linux-2.6.34/include -enable-add-ons=linuxthreads enable-shared-prefix=/usr/local/arm/3.3.2/arm-linux make make install这里的configure选项与之前类似,其中enable-add-ons= linuxthreads是指支持线程。第四步,完整编译gcc在编译完成 glibc 之后,开始编译完整的 gcc。首先,要将第二步在“t-linux”文件中添加的语句去掉,再在终端中执行下列命令:cd gcc-3.3.2/arm-linux make d

18、istclean rm rf ./* ./configure target=arm-linux -prefix=/usr/local/arm/3.3.2 -with-header=/cross/linux-2.6.34/include -enable-shared /支持共享库 enable-threads=pthreads /支持线程 -enable-static enable-languages=c,c+ make make install 可以看到,这时configure中的选项中可以支持线程等操作了。这一步完成之后,就会在/usr/local/arm/3.3.2/bin命令下生成完整的

19、arm-linux-gcc和arm-linux-g+(用于编译C+语言)。这样,交叉编译环境就完全建立起来了。自行建立交叉编译环境需要执行很多命令,而且还要配置很多参数,所以很多人会使用现成的工具建立交叉编译环境。2.3.2 使用工具构建交叉编译环境目前,比较流行的两个交叉编译工具是arm-linux-tools和arm-elf-tools。Arm-linux-tools目前最新的版本是arm-linux-tool s-20070808.tar.gz,该版本发布于2009年11月;arm-elf-tools目前最新的版本是arm-elf-tools-20040427.sh,该版本发布自2004

20、年4月。因此,使用arm-linux-tools的用户更多一些。下面以arm-elf-tools-20040427.sh为例,构建交叉编译环境。第一步是下载软件包,可通过网址:http:/ /opt tar xf arm-linux-tools-20070808.tar.gz解压后,在/opt命令下会产生一个usr子目录,里面就是从arm-linux-tools-20070808.tar.gz解压出来的所有文件。在/opt/usr/local/bin目录下,有用于交叉编译的所有工具,其中包括了编译器和连接器。对Linux内核或开发出来的软件进行交叉编译时,要使用该目录下的工具。为了避免每次编译

21、时输入一长串的路径和输入时产生的错误,可在/etc/profile、/.bash_profile、/.bashrc三个文件中的任何一个里面添加以下代码来修改PATH环境变量。PATH=$PATH:/opt/usr/local/bin这样交叉编译环境就建立好了,之后可以在终端中方便的使用需要的工具完成交叉编译工作。3 交叉编译Linux内核3.1 编译前的准备编译前,要确定内核的放置位置;下载内核源代码;决定使用的内核版本;确定是否需要内核补丁,若需要,下载并为内核打补丁。第一步,确定内核的放置位置。一个比较好的地方就是在个人用户的家目录“”。因为Linux是一个多用户多任务的操作系统,每个用户

22、都有一个家目录用来存放自己的文件,把自己的文件放到自己的家目录里面可以避免文件系统的混乱,同时也可以避免其它用户误删自己的文件。如果不想在自己的家目录编译,也可以使用其它的目录,但这时要注意最好不要在/usr/src/linux目录下编译,因为这个目录是存放宿主机操作系统内核源代码的位置,如果在该目录下进行编译ARM Linux内核,有可能会对宿主机操作系统内核进行重编译,可能会影响到宿主机操作系统的正常启动。第二步,决定使用那个版本的ARM Linux内核。在决定要编译的ARM Linux内核版本的时候,大多数人都希望使用最新的稳定版本。内核的开发者通常使用一串数字来表示一个具体的内核版本。

23、这串数字分成三个部分,中间用“.”分割,例如:Linux-x.y.z。其中x、y、z是版本数字,x是主版本号;y是次版本号,如果y是偶数,则说明该版本是稳定版,相反,如果y是奇数,则说明是开发版或是测试版;z是内核的补丁级别。目前,最新的稳定版本是linux-2.6.34。第三步,下载内核源码维护者编写的特定的补丁。在某些情况下,需要为内核打上一些特定的补丁,这些补丁会在内核中添加一些额外的特定于一些目标机的特性或者设备驱动。通常情况下,内核的维护人员会将自己觉得比较好的对内核的更改以补丁形式发布出来,这些补丁往往以rmk为版本后缀。这些补丁可以通过网址:ftp:/ftp.arm.linux.

24、org.uk/pub/armlinux/so urce/ kernel-patches/找到。由于本文采用2.6.34这个版本的内核,所以不需要下载和安装维护者补丁。第四步,下载内核源代码。内核的源代码可以在kernel.org的ftp站点找到。全球分布着很多这样的ftp站点,它们有着统一的命名模式。所有的这些站点都以“ftp.”开头,以“.kernel.org”结尾,中间是站点所在国家的标示。例如:ftp.uk.kernel.orgftp.us.kernel.orgftp.de.kernel.org等等。下载时根据站点的远近选择合适的站点,然后到/pub/linux/kernel子目录下寻找

25、要下载的版本。例如,我们要下载的2.6.34这个版本的内核就在/pub/linux/kernel/v2.6子目录中。在该目录中,每个版本都会有几个文件,例如2.6.34有以下文件: Linux-2.6.34.tar.gz Linux-2.6.34.tar.bz2Patch-2.6.34.gzPatch-2.6.34.bz2其中,Linux-2.6.34.tar.gz和Linux-2.6.34.tar.bz2是内核源代码的压缩包,Patch-2.6.34.gz和Patch-2.6.34.bz2是对应版本补丁的压缩包。.gz和.bz2只是压缩的方式不同,因此,下载时二者取其一即可。第五步,解压内核

26、源代码并打补丁。解压源代码可在终端中执行下列命令: cd /cross Tar zxwf linux-2.6.34.tar.gz(或bz2)解压后,会在/cross目录下创建一个名为linux-2.6.34的子目录,内核的源代码就在该目录下。接下来执行下列命令为内核打补丁: cd / linux-2.6.34 zcat ./patch-2.6.34.gz | patch -p1准备工作至此就做完了。3.2 编译编译内核可遵循以下步骤:第一步,在内核中配置编译环境。在没有对内核进行配置的情况下,内核编译系统会按照操作系统所运行的平台编译内核,这并不符合交叉编译的目的,所以需要在源代码顶级目录(/

27、cross/linux-2.6.34/)的Makefile中需该两个地方。2.4.x版本的内核,会在Makefile中找到类似下面的语句:ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/).CROSS_COMPILE =2.6.x版本的内核,会在Makefile中找到类似下面的语句:ARCH ?= $(SUBARCH)CROSS_COMPILE ?=将这两行改为下面的代码:ARCH?= armCROSS_COMPILE?= /usr/local/b

28、in/arm-linux-/usr/local/bin/arm-linux-是交叉编译器所在的目录,对应本例可以将它设置成/opt/usr/local/bin/arm-linux-第二步,配置内核。通过配置内核,可以针对某个特定目标机设定一组默认的编译选项和组件。配置内核时2.4.x版本和2.6.x稍有差别。对于2.4.x版本,使用make命令进行内核配置时,使用的选项格式为_config。其中,为目标机名。例如:s3c2410_config ebsa110_config netwinder_config 例如,要针对s3c2410目标机对内核进行配置,可在终端执行下面的命令:make s3c

29、2410_configmake oldconfig执行make oldconfig时,会显示默认配置选项被提交之后新添加的配置项,通常可以选择否来拒绝将这些项添加进来。如果要改变make _config命令产生的配置,要先将产生的.config文件删除掉,再重新执行新的make _config。对于2.6.x版本,使用make命令进行内核配置时,使用的选项格式为_defconfig。例如,可以通过下面的命令配置linux-2.6.34。make s3c2410_defconfig配置2.6.x版本内核不需要执行make oldconfig。第三步,编译内核源代码。可以通过下面的命令完成: ma

30、ke clean make dep make zImage make modules其中,如果之前对内核进行过编译,make clean用于清理之前的编译痕迹;make dep用于建立依赖关系;make zImage生成可执行的内核文件vmlinux和压缩后的可执行的内核文件zImage;make modules用于编译内核模块。至此,ARM Linux内核的编译工作就完成了。压缩后的内核zImage可以在/cross/linux-2.6.34/arch/arm/boot/下找到。4 总结本文首先对交叉编译ARM Linux内核的背景做了描述;然后讨论了建立交叉编译环境的目的,并分别对自己建立

31、交叉编译环境和使用现成工具建立的方法以实例的形式做了详细的描述;最后描述了交叉编译arm-linux内核的方法和步骤,并以linux-2.6.34版本的内核和目标机s3c2410为例,使用arm-linux-tools交叉编译工具完成arm-linux内核的编译工作。参考文献1 于明等. ARM9嵌入式系统设计与开发教程M.北京:电子工业出版社,20062 陈赜等. ARM9嵌入式技术及Linux高级实践教程M.北京:北京航空航天大学,20063 华清远见嵌入式培训中心.嵌入式Linux C编程人民(第2版)M. 北京:人民邮电出版社,20094 蔡利平.构建arm-linux 嵌入式编译器

32、J .软件导刊,2008,7(12):112-1145 尤盈盈,孟利 民.构建嵌入式linux交叉编译环境J.计算机与数字工程,2006,34(6):30-326 鞠剑平,冉全,黎曦.嵌入式Linux在S3C2440上的移植J.科技咨询,2010,(8):17-18作者简介:姚强(1981-),男,河南南阳人,重庆信息技术职业学院教师,硕士研究生毕业,主要研究领域为计算机协同、数据库技术; 郭彩霞(1979-)女(汉族),河南驻马店人,重庆信息技术职业学院教师,硕士研究生毕业,主要研究方向为嵌入式系统。 第一作者通讯地址:重庆市万州区金龙平湖路88号重庆信息技术职业学院软件学院 邮编404000电话:13896370633Email:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 计算机原理

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报