嵌入式Linux系统在ARM平台上的构建

更新时间:2023-08-21 15:17:01 阅读量: 高等教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式,可信计算

2010 年 第19卷 第 10 期 计 算 机 系 统 应 用

嵌入式Linux系统在ARM平台上的构建

李宗海1 陈蜀宇2 李海伟1

(1.重庆大学 计算机学院 重庆 400044;2.重庆大学 软件学院 重庆 400044)

摘 要: 嵌入式系统在人们的日常生活中使用越来越广泛。主要研究了如何在ARM平台上构建嵌入式系统,

讲述了u-boot的工作原理、启动流程,详细介绍了Linux内核、u-boot的裁剪和编译以及根文件系统的制作过程,最后在SBC2410硬件平台上成功的构建了嵌入式Linux系统。

关键词: ARM; 嵌入式Linux; 内核移植; u-boot移植; busybox;

Construction of the Embedded Linux System Based on ARM Platform

LI Zong-Hai1, CHEN Shu-Yu2, LI Hai-Wei1

(puter Science Department, Chongqing University, Chongqing 400044, China; 2.Software Engineer Department, Chongqing University, Chongqing 400044, China)

Abstract: The embedded system, installed in the micro electronic products, is used widely in our daily life. The paper

illustrates the process of building a scalable embedded system on the ARM platform effectively. In the beginning, the theory of u-boot and Linux kernel is introduced. Then, the paper gives some details about u-boot, such as initialization, adjusting and so on. After that, the process of building a root file system is given as well. Finally, an experimental embedded Linux system based on ARM SBC2410 platform is constructed successfully.

Keywords: ARM; embedded Linux; transplantation of the Linux kernel; transplantation of u-boot; busybox

1 引言

嵌入式系统已经成为当今最为热门的领域之一,它迅猛的发展势头引起了社会各方面人士的关注,广泛渗透到人们工作、生活中的各个领域,与我们的生活息息相关,嵌入式处理器已经占分散处理器市场份额的90%以上。

与此同时,嵌入式 Linux操作系统也在嵌入式领域中蓬勃发展,它不仅继承了Linux源码开放、内核稳定高效、软件丰富等优势,而且还具备支持广泛的处理器和硬件平台、占有空间小、成本低廉、结构紧凑等特点[1],是嵌入式操作系统的理想选择。本文主要研究在ARM9平台上搭建嵌入式Linux系统。 ① 基金项目:重庆市自然科学基金(CSTC2008BB2307)

收稿时间: 2010-02-07;收到修改稿时间:2010-03-25

2 嵌入式Linux系统的构成

在嵌入式系统中,操作系统内核是不能够直接运行的,在操作系统内核运行之前必须运行一段程序,我们称之为bootloader,它类似于PC机中的

BIOS程序,通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射图,从而将系统的软硬件带到一个合适的状态,为操作系统内核的运行做准备。

嵌入式Linux系统要想正常运行,除了操作系统内核外,还必须有根文件系统,二者缺一不可,整个嵌入式系统的构成如图1所示。

Application Case 实用案例 153

嵌入式,可信计算

计 算 机 系 统 应 用 2010 年 第19卷 第 10 期

图1 嵌入式系统构成

与大多数bootloader一样,u-boot的启动流程也分为stage1和stage2两个阶段,stage1阶段通常用汇编语言实现,主要完成基本硬件初始化、设置堆栈等工作,为执行stage2阶段的C语言代码做好准备,其具体的工作流程如图2所示。

Stage2阶段通常用C语言实现,以便于实现更复杂的功能和更好的代码可读性及可移植性,并引导操作系统内核,其工作流程如图3所示:

图3 Stage2工作流程

3.3 U-boot源代码组织

board :平台依赖,存放开发板相关的目录文件,cpu :平台依赖,存放CPU相关的目录文件,每一款CPU对应一个目录,如arm920t、i386等目录;

lib_arm :平台依赖,存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数;

common :通用,通用的多功能函数实现,如环境、命令、控制台相关的函数实现;

include :通用,头文件和开发板配置文件,所lib_generic :通用,通用库函数的实现; net :通用,存放网络协议的程序;

drivers :通用,通用的设备驱动程序,主要有以太网接口的驱动,nand驱动等; 3.4 与开发板sbc2410相关的重要文件

SBC2410开发板,其硬件资源为:型号为

图2 Stage1工作流程

S3C2410X的ARM9处理器、2片32M SDRAM、一

系统加电或复位后,所有的CPU通常都从某个由

3 Bootloader移植

CPU制造商预先安排的地址上取指令,而基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(如本平台中的Flash)被映射到这个预先安排的地址上,该地址上存放的代码就是bootloader。通常,bootloader是严重依赖于硬件实现的,因此,在嵌入式世界里建立一个通用的bootloader几乎是不可能的。 3.1 U-boot介绍

常见的bootloader有很多种,而u-boot是使用最广泛的bootloader之一。U-boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目,由FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似;U-boot不仅支持嵌入式Linux系统的引导,还支持NetBSD、VxWorks、QNX、RTEMS、ARTOS、 LynxOS等嵌入式操作系统的引导[2]。另外,硬件方面,u-boot支持PowerPC、MIPS、 x86、ARM、NIOS、Xscale等诸多常用系列的处理器。U-boot项目的开发目标就是支持尽可能多的嵌入式处理器和嵌入式操作系统。

每一套板子对应一个目录,如smdk2410(arm920t);

有开发板的配置文件都在configs目录下;

154实用案例 Application Case

嵌入式,可信计算

2010 年 第19卷 第 10 期 计 算 机 系 统 应 用

片64M Nand Flash、一片2M Nor Flash、一个串口COM0, 一个标准JTAG接口等等。

include/s3c24x0.h :该文件中定义了s3x24x0芯片的各个特殊功能寄存器(SFR)的地址;

=cpu/arm920t/start.s :该文件包含了u-boot中stage1阶段的代码,负责初始化硬件环境,把u-boot从flash加载到RAM中去,然后跳到lib_arm/board.c中的start_armboot中去执行;

lib_arm/board.c :该文件包含了u-boot中stage2阶段的代码,初始化全局数据结构以及设备和控制台;

board/smdk2410/flash.c :该文件中包含=

sbc2410开发板的资源配置,如内存地址,flash型号,外围芯片如网络芯片等;

顶层目录下的Makefile文件 :该文件负责u-boot整体编译配置,每一种开发板在Makefile中都有自己配置的定义,例如smdk2410开发板的定义如下:

smdk2410_config : unconfig arm920t smdk2410 NULL s3c24x0

其中各项的含义如下: arm:CPU架构 arm920t:CPU类型 smdk2410:开发板型号 NULL:开发者

S3c24x0:片上系统SOC

按照上面的定义我们可以在Makefile文件中增加自己的开发板信息

sbc2410_config : unconfig arm920t sbc2410 NULL s3c24x0

3.5 通过交叉编译生成u-boot.bin二进制文件

make sbc2410_config

make CROSS_COMPILE=arm-linux- 3.6 烧写

使用Flash烧写工具sjf2410,通过JTAG接口将u-boot.bin烧写到开发板SBC2410的Nor Flash中。

的内核地址空间,具有单内核系统简单和高性能的特点[3];同时,Linux系统也汲取了微内核的精华,引入了独具特色的模块化设计、抢占式内核,支持内核线程及动态加载内核模块,从而又具有微内核系统的优点,且避免了微内核性能损失的缺陷,同时兼具二者的优点[4]。

Linux操作系统的模块化设计使得用户可以根据具体的应用编译出满足要求的最精简的操作系统内核,大大降低了嵌入式系统的资源消耗,使其更适合嵌入式领域的应用[5]。通过下面的步骤可以编译出一个Linux操作系统内核。

进入Linux源代码的顶层目录,执行以下命令: make mrproper ARCH=arm /*清除原有内核的配置与中间文件*/ make menuconfig ARCH=arm /* 在图形界面中根据自己的需要选择模块,对于不清楚的按照其默认设置,完成后保存退出 */

make dep ARCH=arm CROSS_COMPILE= arm-linux-

/* 建立依赖关系 */

make zImage ARCH=arm CROSS_COMPILE= arm-linux-

/* 编译内核 */

编译操作完成后,最终生成操作系统内核[6] arch/arm/boot/zImage

@/mkconfig $(@:_config) arm

5 构建根文件系统

根文件系统是Linux系统启动时必须挂载的文件系统,它和普通的文件系统的区别在于它包含了Linux启动时所必须的目录和关键性的文件,例如Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序的bin目录等。任何包括这些Linux系统启动所必须的文件的系统都可以成为根文件系统。 5.1 创建根文件系统目录结构

mkdir bin dev lib proc sbin sys usr mnt tmp var usr/bin usr/lib usr/sbin lib/modules [7] /* 创建目录结构 */

mknod –m 666 console c 5 1 /* 创建设备文件 */

Application Case 实用案例 155

@./mkconfig $(@:_config) arm Linux启动时都需要有init目录下的相关文件,在

4 编译内核

Linux操作系统是一个单内核系统,运行在单独

嵌入式,可信计算

计 算 机 系 统 应 用 2010 年 第19卷 第 10 期

mknod –m 666 null c 1 3 /*创建设备文件*/

cp etc-linux/* etc/ -rf /* 复制配置文件 */

5.2 安装内核模块

进入linux内核源代码顶层目录,执行下面命令: make modules ARCHarm CROSS_ COMPILE=arm-linux-

make modules_install ARCH=arm INSTALL_ MOD_PATH

=/home /rootfs

模块安装完后在文件系统的lib/modules下会产生内核生成的模块。 5.3 编译安装busybox

BusyBox被称作是嵌入式开发的瑞士军刀:实用、短小、稳定。

Busybox可以理解为一个Linux的命令集合,我们在进行Linux操作时所需要的常用命令,都可以在busybox里找到,但busybox又不是简单的将所有的命令集合在一起,它采用了一种非常巧妙的方式,

=即“使用一个程序完成所有的事”。

平时我们用ls、vi等命令,都要用到glibc的相关调用,如果每个命令都静态链接这些调用,势必每个命令都会很大,因此在通常的发行版中,都会动态链接glibc,可是glibc的动态库本身就很大,这在PC+Linux平时上还可以接受,但在嵌入式系统中,这就太大了,而且又不是所有的库函数都使用。

一般采用两种解决办法,一种是裁剪glibc,另一种就是使用busybox,busybox把ls、vi等程序的main函数改名后,全部链接在一起,然后静态链接glibc,这样,只有需要的调用的代码才会链接进来,从而使整个busybox程序可能都比glibc的动态库小。

5.3.1 裁剪busybox

make clean 清除旧的编译文件

make menuconfig 执行该命令以后,进入配置主菜单。

首先进入菜单Build Options,选择“Do you want to build BusyBox with a Cross Compiler?”选项,并在“Cross Compiler prefix”栏中输入交叉编译器安装的位置,如/usr/local/arm/2.95.3/ 156实用案例 Application Case

bin/arm-linux-,注意最后是arm- linux-,不能加其他字符或空格;

然后在“Any extra CFLAGS options for the compiler”栏中输入需要匹配的arm-linux系统源码目录中头文件所在的位置,如“/home/linux /include”,然后返回主菜单;

再根据系统需要,进入所需命令工具所在的子菜单中,选择相应的命令项,如需要insmod命令,就在“Linux Module Utilities”子菜单中选中;

选择完成所需的全部命令后,保存配置文件并退出;

5.3.2 编译并安装busybox

Make make install 5.4 制作ramdisk

genext2fs –b 8192 –d /home/roofts ramdisk

gzip -9 –r ramdisk

根文件系统构建完成,最终生成文件ramdisk.gz

6 下载OS内核并配置开发板环境变量

6.1 首先配置宿主机和开发板的IP地址,并启动tftp服务器

6.2 将zImage和ramdisk.gz下载到开发板的Nor Flash中

erase 0x30000 1fffff /*擦出NorFlash为下载软件腾出空间*/

tftp 0x30008000 zImage /* 使用tftp将操作系统内核下载的开发板内存中 */

cp.b 0x30008000 0x30000 0xba07c /* 使用u-boot命令将操作系统内核从内存写入Nor Flash中 */

tftp 0x30800000 ramdisk.gz /* 使用tftp将根文件系统下载的开发板内存中 */

cp.b 0x30800000 0xeb000 5f4fc /* 使用u-boot命令将根文件系统从内存写入Nor Flash中 */

setenv bootcmd cp.b 0x30000 0x30008000 0xba07c \;cp.b 0xeb000 0x30800000 5f4fc \;go 30008000

saveenv /* 设置开发板启动参数 */

嵌入式,可信计算

2010 年 第19卷 第 10 期 计 算 机 系 统 应 用

7 结束语

嵌入式系统的使用越来越广泛,嵌入式软件开发也随处可见,而针对各种不同的硬件环境,嵌入式软件系统的移植与构建,是每个嵌入式程序员的必须掌握的技能,本文详细介绍了嵌入式Linux系统在ARM平台上的移植过程,为嵌入式系统后续软件开发做好准备,希望对嵌入式开发人员有一定的参考价值。

嵌入式Linux系统成功移植到SBC2410开发板,通过超级终端可以看到系统成功启动,如图4所示:

图4 SBC2410平台上的嵌入式Linux系统

参考文献

1 Bovet DP, Cesati M. Understanding the Linux Kernel. 3rd Edition, O'Reilly Media, 2005.10-12.

2 孙琼.嵌入式Linux应用程序开发详解. 北京:人民邮电出版社, 2006.155.

3 于渊. Orange’S:一个操作系统的实现.第二版.北京:电子工业出版社, 2009.301-302.

4 Love R. Linux内核设计与实现.第二版.北京:机械工业出版社, 2006.5-6.

5 Rubini A, Corbet J. Linux设备驱动程序.第三版.北京:中国电力出版社, 2006.22.

6 宋宝华.Linux设备驱动开发详解.北京:人民邮电出版社, 2008.50-55.

7 陈海明.基于U盘Linux系统的制作及应用[硕士学 位论文].北京:中国地质大学, 2009.

Application Case 实用案例 157

本文来源:https://www.bwwdw.com/article/hzci.html

Top