《交叉编译arm linux内核》由会员分享,可在线阅读,更多相关《交叉编译arm linux内核(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-x
2、ia(Institute of Software, 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
3、the section of cross 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 开发领域中不
5、断取得突破。 ARM 作为 IP(Intelligence Property,知识产权)供应商,靠转让许可,由伙伴公司来生产各具特色的芯片。其设计的芯核具有低功耗、低成本等显著优点,获得众多的半导体厂家和整机厂商的大力支持。在全球,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 作
7、为操作系统。1.3 S3C2410X 简介 S3C2410X 微处理器是一款由 samsung 公司为手持设备设计的低功耗、高集成度的基于 ARM920T 核的微处理器2。为了降低系统总成本和减少外围器件,这款芯片还集成了 16KB 指令 Cache、16KB 数据 Cache、MMU、外部存储器控制器、LCD 控制器、NAND FLASH 控制器、4 个 DMA 通道等部件。目前 S3C2410X 被广泛应用于 PDA、移动通信、路由器、工业控制等领域。其内部结构如图 1 所示。 图 1 S3C2410X 结构框图2 建立 ARM -Linux 交叉编译环境交叉编译是指在一个平台上利用交叉编
8、译工具生成另一个平台上的可执行代码。这里的平台,包含两个概念:体系结构(Architecture) 、操作系统(Operating System) 。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。例如, x86 Linux 平台实际上是 Intel x86 体系结构和 Linux for x86 操作系统的简称;而 x86 WinNT 平台实际上是 Intel x86 体系结构和 Windows NT for x86 操作系统的简称。2.1 交叉编译的目的采用交叉编译的主要原因在于,多数嵌入式目标机不能提供足够的资源供编译过程使用,因而只好将编译工作转
9、移到高性能的宿主机(嵌入式软件开发环境和编译环境所在平台,通常是基 X86 的 PC 机)中进行。其目的是利用宿主机丰富的资源完成嵌入式嵌入式软件的编译工作,产生可以在特定嵌入式平台上运行的程序代码。另外,有时目标机还没有建立,还没有操作系统,更谈不上运行编译器,这时也需要建立交叉编译环境。2.2 准备工作交叉编译器是一个由编译器、连接器和解释器组成的综合编译环境 1。在建立交叉编译环境之前要先做好准备工作。首先,要准备好宿主机平台,建议采用 x86 Linux 做宿主机平台,因为采用这种平台需要的设置工作很少。其次,要准备构建交叉编译器需要的软件包。交叉编译器可以通过编译源代码来自己生成,也
10、可以直接从网上下载现成的工具。自己编译生成交叉编译器,必须先做以下准备:1、宿主机可用磁盘空间要 500M 以上。 2、下载所需要的源代码。主要包括 binutils、gcc、linux 、glibc、glibc-linuxthreads 的源代码。其中 binutils 包含链接器、 汇编编译器等工具,gcc 是 GUN C/C+编译器,glibc 是 GNU 的 C 语音库,linux 是 Linux 内核源代码,glibc-linuxthreads 提供 Linux 线程库。在下载这些源代码时尽量使用较新的版本,还要注意, glibc 和内核源代码的版本必须与目标机上实际使用的版本保持一
11、致。这里使用的源代码如下:Binutils 选择 Binutils-2.14.tar.bz2; Gcc 选择 gcc-3.3.2.tar.bz2;Glibc 选择 glibc-2.2.5.tar.bz2;Glibc-linuxthreads 选择 glibc-linuxthreads-2.2.5.tar.bz2;Linux 内核选择 Linux2.6.34。最后,准备相关的目录,这些目录最好是在当前用户的家目录。首先,在家目录下创建/cross 目录,然后在/cross 目录下创建 source、patches、Linux-2.6.34 三个子目录。如果使用现成的交叉编译工具,则只用下载整合的
12、交叉编译包。2.3 构建交叉编译环境2.3.1 自己编译构建交叉编译环境自己编译构建交叉编译器遵循以下步骤 3:1)编译 binutils;2)初次编译 gcc;3)编译 glibc;4)完整编译 gcc第一步,编译 binutils在宿主机操作系统中打开终端,在终端中依次执行下列命令:cd /cross /切换到 cross 目录下tar jxvf ./source/binutils-2.14.tar.bz2 /解压 binutils 压缩包cd binutils-2.14 mkdir arm-linux /创建 arm-linux 常用工具链目录cd arm-linux ./configu
13、re target=arm-linux prefix=/usr/local/arm/3.3.2 /生成 binutils 的 Makefile 文件,target 指明交叉编译的目标板体系结构,prefix 指明编译完成后的安装目录。make /编译 binutils 源代码make install /安装这一步完成之后,编译出来的工具安装在/usr/local/arm/3.3.2/bin 目录下。为了以后能够在终端中直接使用这些工具,可在/etc/profile、/.bash_profile、/.bashrc 三个文件中的任何一个里面添加以下代码来修改 PATH 环境变量。PATH=$PAT
14、H:/usr/local/arm/3.3.2/bin第二步,初次编译 gccgcc 的编译分两次。由于此时还没有编译 glibc,因此还不能完整地编译 gcc,但 glibc 的编译又离不开 gcc,因此,在这里需要首先编译一个具备最基本功能的 gcc,在编译完 glibc 之后再完整编译 gcc。初次编译 gcc 可按以下步骤进行。首先,在终端中执行以下命令:cd /cross tar jxvf ./source/gcc-3.3.2.tar.bz2 cd gcc-3.3.2然后,使用文本编辑工具打开 gcc/config/t-linux 这个配置文件,在文件中第一行代码的最后添加 -Dinh
15、ibit_libc D_gthr _posix.h,在 #INSTALL_LIBGCC = install-multilib 这一行后另起一行,添加 T_CFLAGS = -Dinhibit_libc D_gthr_posix.h,使后面的编译过程不编译 libc 和 gthr_posix.h 文件。最后,编译 gcc。在终端中执行以下命令:mkdir 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 指定仅支持 C 语言。第三步,编译 glibc 编译 glibc 与前面两步类似,可在命令行执行下列命令:tar zxvf /c