基于PXA255的嵌入式Linux应用平台的构建

发布者:古泉痴迷者最新更新时间:2012-03-22 来源: 微计算机信息 关键字:嵌入式Linux  Bootloader  Linux内核 手机看文章 扫描二维码
随时随地手机看文章

1 引言

嵌入式Linux(Embedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量仅有几十万字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux是由很多体积小且性能高的微内核系统组成,在内核代码完全开放的前提下,不同领域和不同层次的用户可以根据自己的应用需要很容易地对内核进行改造,在低成本的前提下,设计和开发出真正满足自己需要的嵌入式系统。

随着电子市场的发展壮大,高性能低功耗的多媒体手提设备和无线设备越来越受到市场的欢迎,Intel XScale PXA255处理器正是针对这一情况推出的。它采用Intel XScale微结构体系框架,采用ARMV5TE的7级超流水线,可以工作在200MHz、300MHz、400MHz下,集成了许多常用的外围接口,功能强大。本文将介绍如何在Intel XScale PXA255上构建嵌入式Linux应用平台。

一个嵌入式Linux系统的构建由以下步骤组成:加载Bootloader引导程序、交叉编译环境下加载和编译Linux内核和与之配套的根文件系统等,下面就逐步介绍各个步骤的实现情况。

2.1 加载Bootloader引导程序

 Bootloader引导程序是系统加电启动后运行的第一段软件代码。回忆一下PC的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的引导程序一起组成。而在嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由Bootloader来完成。Bootloader的启动流程一般分为两个阶段:stage1和stage2。在 stage1中的代码通常用汇编语言实现,以提高系统运行的效率,而stage2中通常用C语言实现,目的是实现更复杂的功能和取得更好的代码可读性和可移植性。

在stage1中Bootloader主要完成以下工作:

项目基金:国家自然科学基金(50678099)

(1)基本的硬件初始化。

(2)为加载stage2准备RAM空间。

(3)拷贝stage2到RAM空间中。

(4)设置堆栈指针sp,这是为执行stage2的C语言代码做好准备。

在stage2中Bootloader主要完成以下工作:(1)用汇编语言跳转到main入口函数。(2)初始化本阶段要使用到的硬件设备。(3)检测系统的内存映射。(4)加载内核映像和根文件系统映像。(5)设置内核的启动参数。

本平台中的Bootloader选择的是U-Boot(Universal Bootloader),是遵循GPL条款的开放源码项目。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的 Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中就能体现这一点。就目前为止,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。

在http://sourceforge.net/projects/u-boot下下载最新版本的U-Boot,移植之前需要仔细阅读u-boot目录下的readme文件,其中对如何移植做了简要的介绍。为了减少移植的工作量,可以在include / config目录下选一个和要移植的硬件相同或相似的开发板,根据硬件平台的配置情况和参考现有的源码,对配置文件进行修改和配置,如修改和配置 FLASH信息、SDRAM信息、网络配置、处理器配置、中断、开发版参数设置等。之后用make命令生成映像文件下载并烧写到FLASH中。

2.2 交叉编译环境下加载和编译Linux内核

2.2.1 建立交叉编译环境

所谓交叉编译是指当主机系统和目标系统的体系结构与操作系统不兼容时,将在主机系统上编译的可执行程序应用到目标系统上运行的编译方法。嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件比较困难,有时候甚至是不可能的。所以需要建立交叉编译环境,下载hybus- arm-linux-R1.1.tar.gz到/usr/local目录下。 [page]

# cd usr/local

# tar zxvf  hybus-arm-linux-R1.1.tar.gz

生成hybus-arm-linux-R1.1目录,然后在/root/.bash_profile下修改添加以下路径:

PATH=$PATH:/usr/local/ hybus-arm-linux-R1.1/bin

export PATH

至此,交叉编译环境建立完成。

2.2.2  加载和编译Linux内核

Linux系统的内核采用单块结构,可以动态地加载和卸载模块。系统利用内核模块的可动态加载和卸载功能,可以方便地在内核中添加新的组件或卸载不再需要的内核组件。内核模块的动态装载性使得内核映像的尺寸保持在最小,并且具有最大的灵活性,同时便于检验新的内核代码,而不需重新编译内核且重新引导,从而用户可以根据自己系统的需要构筑自己的私有内核,其源码的公开更为改造其内核提供了可能,尤其为重建有特殊要求的操作系统提供了可能。Linux的内核版本发行同Linux对嵌入式处理器支持程度的发展是不同步的,因此需要对特定的处理器体系结构选择适合的内核,在本文中选用2.4.18的内核版本,下载已经打好补丁的内核资源linux-2.4.18-rmk7.tar.bz2。

# tar jxvf linux-2.4.18-rmk7.tar.bz2

# cd linux-2.4.18-rmk7

# make menuconfig

# make dep

# make zImage

完成后在arch/arm/boot 路径下生成映像文件zImage,下载到开发平台上并烧写到FLASH中。

2.3 配置根文件系统

Linux并不使用设备标志符(如设备号或驱动器名称)来访问独立文件系统,而是通过一个将整个文件系统表示成单一实体的层次树结构来访问它。一个根文件系统需要包含支持Linux系统运行的所有文件,通常包括:

(1)基本的文件系统结构。

(2)基本的目录: /dev, /proc, /bin, /sbin, /etc, /tmp等。

(3)基本的工具: sh, ls, cp, cd, mv等。

(4)基本的配置文件: rc, inittab, fstab等。

(5)设备: /dev/hd*, /dev/tty*, /dev/fd0, /dev/ram*, /dev/console等。

(6)基本的运行库。 [page]

为了建立根文件系统,可以利用BusyBox工具,在网上下载最近版本busybox-1.1.0.tar.gz,一些主要步骤如下:

#tar zxvf busybox-1.1.0.tar.gz

#cd busybox-1.1.0

#make menuconfig

在build Options菜单下,可以选择静态库编译方式

[*]Build BusyBox as a static binary (no shared libs)

还需要使用带glibc库支持的交叉编译器arm-linux-gcc

[*]Do you want to build BusyBox with a Cross Compiler?

/usr/local/hybus-arm-linux-R1.1/bin/arm-linux-

在installation Options中选安装路径,默认是_install目录

[*]Don't use /usr

(./_install)BusyBox installation prefix

之后选择一些需要的编译命令后就可以编译BusyBox了。

#make dep

#make

#make install

完成后生成_install目录,目录下有bin linuxrc sbin目录,下面介绍对根文件系统的进一步配置:

建立etc目录

#mkdir etc

建立rc文件,内容如下:

#!/bin/sh

hostname XScale

mount -t proc proc /proc

cat /etc/motd

改变rc属性

#chmod 777 rc

建立inittab文件,主要内容如下:

::sysinit:/etc/init.d/rcS

::askfirst:/bin/sh

tty1::respawn:/sbin/getty 38400 tty1

tty2::respawn:/sbin/getty 38400 tty2

::restart:/sbin/init

::ctrlaltdel:/sbin/reboot

::shutdowm:/bin/umount -a -r

::shutdowm:/sbin/swapoff -a

在init.d目录下,建立rc文件的符号连接文件rcS[page]

#ln -s ../rc rcS

建立dev目录,创建设备文件,可以用mknod命令创建,也可以复制主机平台/dev目录下的一些需要的设备文件到/_install/dev目录下。

制作JFFS2文件映像,在busybox-1.1.0目录下

#./mkfs.jffs2 -o newfs.img -e 0x40000 -r _install -p -l

生成映像文件newfs.img,下载并烧写到FLASH中。

3 结束语

   本文在Intel XScale PXA255处理器和Linux操作系统的基础上构建嵌入式Linux应用平台。主要分析了Bootloader的功能特点和实现Bootloader映像的制作、Linux系统的特点和交叉编译环境下加载和编译Linux内核,最后介绍支持Linux系统运行的精简根文件系统的实现。

本文作者创新点是:利用BusyBox这一工具,详细介绍了在PXA255处理器上精简根文件系统的实现过程,由于采用接口功能强大的XScale处理器和运行稳定的Linux操作系统构建嵌入式Linux应用平台,降低了开发难度,在很大程度上提高了应用平台的可靠性、稳定性和可维护性。可以根据需要编写程序,使开发板用于实际的工业应用等。

参考文献:

[1] 孙琼.嵌入式Linux应用程序开发详解[M].北京:人民邮电出版社,2006

[2] 夏玮玮,沈连丰,肖 婕,等.嵌入式系统关键技术分析与开发应用[J].业界论坛,2003,(2):5-9.

[3] SARWAR.A1.SAGABI.LINUX&UNIX程序开发基础教程[M].英宇,姚锋,译.北京:清华大学出版社,2004.

[4] 英海燕.基于ARM的嵌入式Linux操作系统移植[J].现代情报,2005,(5):155-156.

[5] Karim Yagbmour.Building embedded Linux system[M].O'Reilly & Associates,Inc.2003

[6] 白伟平, 包启亮.基于ARM的嵌入式Bootloader 浅析[J].微计算机信息, 2006, 4- 2:99- 100.

关键字:嵌入式Linux  Bootloader  Linux内核 引用地址:基于PXA255的嵌入式Linux应用平台的构建

上一篇:嵌入式轻量Agent平台的构建研究
下一篇:基于QR Code条码的飞机加油统计系统

推荐阅读最新更新时间:2024-03-16 12:56

【dsPIC33E】Bootloader(一)Bootloader的介绍与Flash结构
对于嵌入式开发而言,Bootloader几乎与操作系统同等重要,它可以让我们摆脱MCU官方工具,定制自己的烧录工具,不仅提高产品辨识度,同时也大大减少了对外引脚数量(例如兼容通信的Uart或CAN等,而不需要另外接JTAG)。 要开发Bootloader,相对于普通程序,是有一定难度的,这其中涉及到MCU的工作原理、内部存储结构等,而且仅仅依靠C语言可能无法完成,有时需要配合汇编来精确执行特殊指令(例如Flash擦写)。 一般MCU的机器码都是存储在Flash中,MCU启动时PC指针会从内部Flash第一个地址开始读取指令运行,这个过程我们一般无法干涉。但由于我们写的代码存于Flash中,所以一旦从Flash启动,后续操作
[单片机]
【dsPIC33E】<font color='red'>Bootloader</font>(一)<font color='red'>Bootloader</font>的介绍与Flash结构
友善之臂Mini2440NORflash bootloader烧写详述---亲测可用
bootloader: 1.友善之臂提供的Superboot2440.bin(该bootloader可以使用友善之臂提供的MiniTools一键烧写工具)该文件在开发板提供的资料images文件夹中(本资源有上传) 2.友善之臂的Supervivi(烧写Norflash中Supervivi再通过dnw依次烧写的Nandflash的bootloader、内核、文件系统((本资源有上传)supervivi-128M.bin) 硬件设备: 1.J-Link_ARM 2.J-Link转接板 3转接板与开发板的连接线 4.友善之臂的mini2440开发板套件 软件: J-Link软件 硬件连接: 1.电脑—
[单片机]
友善之臂Mini2440NORflash <font color='red'>bootloader</font>烧写详述---亲测可用
11-S3C2440驱动学习(八)嵌入式linux-块设备驱动程序
一、回顾字符设备驱动 主要分为简单字符设备驱动程序,和复杂字符设备驱动 1、简单字符设备驱动 对于简单的字符设备驱动,不需要采用分离分层的思想,主要包括以下几个部分。 2、复杂字符设备驱动 对于复杂的字符设备驱动,采用分离分层的思想,内核中已经实现好了核心层部分,我们只需要实现与硬件相关的部分就可以,最后形成一个总体。这样就是一个通用的字符驱动框架。如LCD驱动、V4L2驱动,当然有时候我们可以选择不采用分离分层的思想,按简单驱动程序的框架来实现一个驱动。 3、字符设备驱动常用技巧 (1) 查询方式 (2) 休眠唤醒,APP-read drv_read (3) poll机制 (4) 异步通知发信号
[单片机]
11-S3C2440驱动学习(八)<font color='red'>嵌入式linux</font>-块设备驱动程序
realme真我X50 Pro支持解锁BootLoader
我们上官方论坛发现目前升级安卓10操作系统的 realme真我X50 Pro的BootLoader(以下简称BL)解锁工具已经登场了,顺便该机的源代码也已经开放,意味着该机的第三方ROM也即将来临,喜欢折腾手机的realme真我X50 Pro用户可以行动了。 值得注意的是,realme官方提醒解锁BL会有以下风险,普通消费者需要谨慎行事: 1、解锁后可能会对手机造成不可预估的影响; 2、三方固件有可能会使手机部分功能无法正常运行,例如相机拍照功能不可用,并可能导致设备受损; 3、可能造成手机上的私密个人信息泄漏; 4、解锁后,将影响系统升级,用户无法收到系统OS的后续更新版本; 5、解锁后,手机状态相当于恢复出厂设置,所有用户
[手机便携]
自己用C语言写单片机PIC16 serial bootloader
  为什么自己写bootloader   我的第一款自己的serial bootloader是为Microchip PIC16单片机写的UART bootloader,我命其名为HyperBootloader_PIC16. 为什么取这个名字,下面会讲。很多朋友可能会问为什么要自己写bootloader, 百度上一搜,有不少下载下来直接就可以用。比如ds30_Loader 就很不错,免费,还支持Microchip很多系列的单片机。是没错,但是网上搜到的bootloader用C语言写的少得可怜,或者不能用,或者不是用XC8编译的(Microchip 的C编译器)。它们绝大多数都是用汇编写的,包括ds30_Loader。对于不怎么用汇编
[单片机]
自己用C语言写单片机PIC16 serial <font color='red'>bootloader</font>
ATMega48的Bootloader的软件实用方法
AVR是Atmel公司推出的第一款真正意义上的RISC结构8位单片机,具有先进的指令集及单时钟周期指令执行时间,数据吞吐率可高达1MIPS,其性能明显优于其他类型8位单片机。 作为AVR主流产品,Mega系列的很多产品(Mega8/Megal6/Mega32/Mega8535等)在硬件上都支持Boot-loader功能。这样MCU可灵活运行BOOT区程序,实现在应用编程(IAP)及一些高级应用,如系统智能升级,密码校验自保护,远程系统更新等。但有很高性价比的Mega48在硬件上却不支持Bootloader功能。因此,本文针对Mega48首次提出两种软件实现Bootloader的方法:跳转保存法和倒置法。 1 ATMega
[单片机]
深入研究嵌入式web服务器的视频监控应用
1.引言         随着微处理器技术、计算机网络技术的进步,基于嵌入式WEB的网络数字视频监控系统逐渐得到了人们的广泛关注。把图像采集、视频压缩和WEB功能集中到一个体积很小的设备内,可以直接连入局域网和Internet,达到即插即用,省掉多种复杂的电缆,安装方便,用户也无须安装任何硬件设备即可观看,这使得由嵌入式网络视频监控服务器组成的监控网络组网和扩展都极为灵活方便。 2.WEB服务器所在系统工作原理        如图1所示,系统有两种网络接入方式:通过PPPOE自动拨号,动态获取IP联入Internet;自定义静态IP连入局域网。      之后,系统的整个工作流程包括两条主线:       1
[嵌入式]
基于Qtopia的嵌入式中文输入法设计
    随着基于ARM内核芯片的大规模应用,手持嵌入式设备迎来了一个庞大的市场。与用户直接打交道的图形界面的友好程度决定了用户对该产品的感观认识。在这个方兴末艾的市场,嵌入式Linux由于其系统优异的健壮性,以及开源、免费等显著优势,成为嵌入式设备的主流操作系统。其中,Qtopia是Trolltech公司为采用嵌入式Linux操作系统的消费电子设备而开发的综合应用平台,因其友好的界面、完善的开发环境,已被国内移动电话制造商中兴通讯选作其移动电话ZTEU980基于Linux的应用开发框架,使Qtopia电话版成为中兴通讯支持中国3G标准TD-SCDMA的核心部件,Qtopia在嵌入式市场的竞争中拨得头筹。     在Qtopia的应
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved