当前位置:
文档之家› 基于ARM的嵌入式linux内核裁剪及移植实战
基于ARM的嵌入式linux内核裁剪及移植实战
具 软 件 Busboy 和 MKCRAMFS 制 作 CRAMFS 文 件 系
统。首先在本地建立根文件系统 myroot,然后在其目
录下建立所需要的子目录,bin,dev,usr, mnt, proc,
lib,sbin 等。建立好目录之后要各相应的目录复制相
应的文件或库,可以通过 BusyBox 来实现[4]。
行配置,配置完成后通过输入命令:make 即可在/arch/
arm/boot 下生成所需要的内核文件 zImage。
2.4 文件系统
目前嵌入式系统可以选择的根文件系统有:
Romfs、CramFS、Ramfs、Jffs2、Ext2 等等,本系统采
用 CramFS 作为 uCLinux 嵌入式系统的只读根文件系
#mkcramfs root cramfs.Img
根据可用的系统资源和引导装载程序的功能,内 核 可 以 编 译 成 vmlinux、Image 或 zImage。 vmlinux 和 zImage 之间的主要区别在于 vmlinux 是实际的(未压缩 的)可执行文件,而 zImage 是或多或少包含相同信息 的自解压压缩文件―只是压缩它以处理(通常是 Intel 强制的)640 KB 引导时间的限制。
Linux 的程序源码全部公开,任何人都可以根据自 己的需要裁剪内核,以适应自己的系统。文章以 linux 移植到 ARM920T 内核的 S3C2410 处理器芯片为例,介 绍了嵌入式 linux 内核的裁剪以及移植过程,文中介绍 的基本原理与方法技巧也可用于其它芯片。 2.1 交叉编译环境
嵌入式开发之前,首先要建立一个交叉编译环境, 这是一套编译器、连接器和 libc 库等组成的开发环 境。在主机上创建一个用于编译并将在目标上运行的 内核和应用程序的构建环境。交叉编译器完整的安装 涉及到多个软件安装,最重要的有 binutils、gcc、glibc 三个 。 [3] 其中,binutils 主要用于操作二进制文件的实
统。Cramfs 是 Linus 的一个文件系统,有很好的压
率,可直接从 Flash 上运行,不需 load 到 RAM 中,
节约了 RAM。但 Cramfs 是只读的,对于需要运行时
修改的目录 (如:/etc, /var, /tmp) 多有不便。因此,
一般将这些目录做成 ramfs 等可写的 fs。可以利用工
0引言 目前,各种嵌入式 Linux 操作系统迅速发展,已形
成了能与 WindowsCE 等嵌入式操作系统进行有力竞 争的局面。嵌入式 Linux 操作系统的迅速崛起,主要 是由于人们对自由软件的渴望与嵌入式系统应用的特 制性,要求提供系统源码层次上的支持等,而嵌入式 Linux 正是为满足这一需求出现的。由于商业嵌入式 操作系统昂贵,系统源码封闭,需要较长时间来学习掌 握,因此许多用户采用免费和开放源码的嵌入式系统, 基于 Linux 的嵌入式系统是目前较为常用的一种开源 的嵌入式操作系统[1]。但 Linux 也有自己的缺点,内核 比较大,实时性能也比较差,所以它不适用于实时性要 求很高的领域。 1 嵌入式 Linux 操作系统
CROSSCOMPILE-/opt/crosstoo1/gcc-3.3.6-glIhc-2.3.2/
arm-linux/bin/arm-linux;2)设置 NAND FLASH 分区;
在 areh/arm/maeh s3c2410/devs.C 中添加头文件;3)将
static struct mtd-partition partition-info[]中的分区和 VI⁃
系统加电或复位后,CPU 通常都从 CPU 制造商 预先安排的地址上取指令,如基于 ARM9 内核的 CPU 在 复 位 时 都 从 地 址 Ox00000000 处 取 它 的 第 一 条 指 令。而嵌入式系统通常都有某种类型的固态存储设备 (如 ROM、EEPROM 或 FLASH 等)被安排在这个起始 地址上。因此在系统加电或复位后,处理器将首先执 行存放在起始地址处的程序。通过集成开发环境 IDE 可以将 BootLoader 定位在起始地址开始的存储空间 内。所以,BootLoader 是系统加电后,操作系统内核 或用户应用程序运行之前,首先必须运行的一段代 码。通过这段小程序可以初始化硬件设备、建立内存 空间的映射图,从而将系统的软硬件环境带到一个合 适的状态,以便为最终调用操作系统内核准备好正确 的环境。
从 网 上 下 载 所 需 资 源 文 件 linux-2.6.27.tar.bz2、 binutils-2.15.tar.bz2、gcc-3.3.6.tar.bz2、glibc- 2.3.2.tar. bz2、glibc-linuxthreads-2.3.2.tar.g 和 linux-libc-head⁃ ers- 2.6.12.0.tar.bz2。然后将这些工具包文件放在新 建 的/home/downloads( 刚 开 始 文 件 名 是 建 立 成 down⁃ load,后来改成 downloads)目录下,最后在/home 目录下 解压 crosstool-0.42.tar.gz,修改 arm.sh 脚本,及配置文 件、添加环境变量后。重新启动终端即可链接成功。 2.2 Bootloader 的移植
【摘 要】 文章介绍了嵌入式 Linux 系统的框架、构建及其移植方法,并以 S3C2410 处理器芯片为例,将 Linux 操作 系统移植到 ARM 处理器上;并介绍了开发环境的搭建、Bootloader 的架构及功能、内核、文件系统的编译及移植 方法。 【关键词】 Linux ARM;剪裁;移植 【中图分类号】 TP311.54 【文献标识码】 A 【文章编号】 1003-773X(2010)06-0183-03
收稿日期:2010-05-26;修回日期:2010-08-23 作者生,研究方向:测试计量技术及仪器。
·183·
第 25 卷第 6 期(总第 118 期)
机械管理开发
2010 年 12 月
映像和根文件系统映像从 FLASH 中读取到 RAM 中, 可以设置好启动参数后启动内核。
VIVI 的 stagel 是 BootLoader 一开始就执行的操作, 其目的是为了 stage2 的执行以及随后的内核的执行设 置好一些基本的硬件环境。其步骤如下:1)硬件初始 化:当上电或复位后,VIVI启动,位于NAND中的前4 KB 程序便从 NANDFLASH 中由 S3C2410 自动拷贝到 step⁃ pingstone 的前 4kB 的内部 RAM 中,该 RAM 之后被映射 到地址 0x00 处。此时 VIVI 的前 4kB 代码开始运行,关 闭 Watchdog,关闭中断,初始化 PLL 和时钟主频设定, 初始化存储器设定。2)配置串口:初始化串口控制 器。3)复制自身到 SDRAM 中:当初始化串口结束后, VIVI 开 始 把 自 身 从 NANDFLASH 中 复 制 到 SDRAM 中。4)跳转到 stage2 的入口点。VIVI 的 stage2 阶段, 包括以下步骤:(1)继续初始化系统硬件;(2)内存影 射初始化,内存管理单元初始化;(3)初始化堆栈;(4) 初始化 mtd 设备;(5)初始化私有数据;(6)初始化内 置命令;(7)启动 VIVI。
本实验系统运行的 Linux 版本是针对 2.6.14.1 进 行移植,下载内核代码在/linux 下,移植按照以下步骤: 1)设置目标平台和指定交叉编译器:在最上层的根目 录/Makefile 文件中,首先要指定所移植的硬件平台以 及 所 使 用 的 交 叉 编 译 器 。 改 为 如 下 :ARCH-arm
创 建 Cramfs 文 件 系 统 需 要 mkcramfs 工 具 ,mk⁃
cramfs 能把相应的 Cramfs 目录树压缩成为单一的映象
文件,Mkcramfs 的命令格式为:
Mkcramfs [-h] [--e edition] [-I file] [-n name] Dir⁃
Name OutFile
S3C2410 用 VIVI 作为系统的 BootLoader。VIVI 是 CPU 加电后运行的第一段程序,其基本功能是初始化 硬件设备,建立内存空间的映射图,继而为调用嵌入式 Linux 内核做好准备。VIVI 由两部分组成:一部分依 赖于 CPU 体系结构的、用汇编语言实现的代码。对硬 件环境的初始化,并为第二部分代码的执行做好准备, 另一部分是内存空间的映射,由 C 语言实现,并将内存
Bootloader 的移植:① 修改 Malkefile,指定交叉编 译 : ARCH-armCROSS COMPII E-/opt/crosstool/ gcc-3.3.6-glibe-2.3.2/。 ② 修 改/arch/s3c2410/smdk..c 文件,按照上面所指定大小指定 NAND 分区。③ 编译 生成 VIVI。 2.3 Linux 内核的移植
VI 中的分区分成一样大小;4)加入 NAND FLASH 分
区;5)建立芯片支持;6)在 NAND FLASH 驱动里加入
NAND FLASH 芯片支持;7)在 arch/arm/machs3c2410/
machsmdk2410.c 中 initdata 部 分 增 加 gas3c-de⁃
vice-nand,使内核启动时初始化 NAND FLASH 信息;
用程序集合。它们包括诸如 ar,as,objdump,objcopy 这样的实用程序;gcc 则用来生成交叉编译器,主要生 成 arm-linux-gcc 交叉编译工具;glibc 主要是提供用户 程序所使用的一些基本的函数库。所有用户应用程序 都将链接到 C 库。避免使用任何 C 库函数的内核和其 它应用程序在没有该库的情况下进行编译。
嵌入式 Linux(Embedded Linux)是指在标准 Linux 基础上经过裁剪、修改,适用于嵌入式系统并应用于特 定嵌入式场合的专用 Linux 操作系统。与其它的嵌入 式操作系统相比,嵌入式 Linux 具有以下特点:具有开 放源代码,系统内核较小、效率高、内核网络结构完整, 针对嵌入式的存储方案,提供实时版本和完善的嵌入 式解决方案、具备一整套工具链,容易搭建嵌入式系统 的开发环境,裁减后的系统适用于诸如信息家电等嵌 入式系统的开发[2]。 2 内核移植