嵌入式系统杂谈.docx

上传人:b****2 文档编号:2079525 上传时间:2022-10-26 格式:DOCX 页数:48 大小:38.30KB
下载 相关 举报
嵌入式系统杂谈.docx_第1页
第1页 / 共48页
嵌入式系统杂谈.docx_第2页
第2页 / 共48页
嵌入式系统杂谈.docx_第3页
第3页 / 共48页
嵌入式系统杂谈.docx_第4页
第4页 / 共48页
嵌入式系统杂谈.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

嵌入式系统杂谈.docx

《嵌入式系统杂谈.docx》由会员分享,可在线阅读,更多相关《嵌入式系统杂谈.docx(48页珍藏版)》请在冰豆网上搜索。

嵌入式系统杂谈.docx

嵌入式系统杂谈

嵌入式设备上的Linux系统开发

英文原文

出于好玩和获利目的修补PDA

AnandKSanthanam(asanthan@),软件工程师,IBMGlobalServices

VishalKulkarni(kvishal@),软件工程师,IBMGlobalServices

2002年3月

如果您刚接触嵌入式开发,那么大量可用的引导装载程序(bootloader)、规模缩小的分发版(distribution)、文件系统和GUI看起来可能太多了。

但是这些丰富的选项实际上是一种恩赐,允许您调整开发或用户环境以完全符合您的需要。

对Linux嵌入式开发的概述将帮助您理解所有这些选项。

Linux正在嵌入式开发领域稳步发展。

因为Linux使用GPL(请参阅本文后面的参考资料),所以任何对将Linux定制于PDA、掌上机或者可佩带设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发。

许多Linux改良品种迎合了嵌入式/实时市场。

它们包括RTLinux(实时Linux)、uclinux(用于非MMU设备的Linux)、MontavistaLinux(用于ARM、MIPS、PPC的Linux分发版)、ARM-Linux(ARM上的Linux)和其它Linux系统(请参阅参考资料以链接到本文中提到的这些和其它术语及产品。

嵌入式Linux开发大致涉及三个层次:

引导装载程序、Linux内核和图形用户界面(或称GUI)。

在本文中,我们将集中讨论涉及这三层的一些基本概念;深入了解引导装载程序、内核和文件系统是如何交互的;并将研究可用于文件系统、GUI和引导装载程序的众多选项中的一部分。

引导装载程序

引导装载程序通常是在任何硬件上执行的第一段代码。

在象台式机这样的常规系统中,通常将引导装载程序装入主引导记录(MasterBootRecord,(MBR))中,或者装入Linux驻留的磁盘的第一个扇区中。

通常,在台式机或其它系统上,BIOS将控制移交给引导装载程序。

这就提出了一个有趣的问题:

谁将引导装载程序装入(在大多数情况中)没有BIOS的嵌入式设备上呢?

解决这个问题有两种常规技术:

专用软件和微小的引导代码(tinybootcode)。

专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在闪存的给定位置中。

闪存设备是与存储设备功能类似的特殊芯片,而且它们能持久存储信息—即,在重新引导时不会擦除其内容。

这个软件使用目标(在嵌入式开发中,嵌入式设备通常被称为目标)上的JTAG端口,它是用于执行外部输入(通常来自主机机器)的指令的接口。

JFlash-linux是一种用于直接写闪存的流行工具。

它支持为数众多的闪存芯片;它在主机机器(通常是i386机器—本文中我们把一台i386机器称为主机)上执行并通过JTAG接口使用并行端口访问目标的闪存芯片。

当然,这意味着目标需要有一个并行接口使它能与主机通信。

Jflash-linux在Linux和Windows版本中都可使用,可以在命令行中用以下命令启动它:

Jflash-linux

某些种类的嵌入式设备具有微小的引导代码—根据几个字节的指令—它将初始化一些DRAM设置并启用目标上的一个串行(或者USB,或者以太网)端口与主机程序通信。

然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。

在安装它并给予其控制后,这个引导装载程序执行下列各类功能:

∙初始化CPU速度

∙初始化内存,包括启用内存库、初始化内存配置寄存器等

∙初始化串行端口(如果在目标上有的话)

∙启用指令/数据高速缓存

∙设置堆栈指针

∙设置参数区域并构造参数结构和标记(这是重要的一步,因为内核在标识根设备、页面大小、内存大小以及更多内容时要使用引导参数)

∙执行POST(加电自检)来标识存在的设备并报告任何问题

∙为电源管理提供挂起/恢复支持

∙跳转到内核的开始

带有引导装载程序、参数结构、内核和文件系统的系统典型内存布局可能如下所示:

清单1.典型内存布局

/*TopOfMemory*/

Bootloader

ParameterArea

Kernel

Filesystem

/*EndOfMemory*/

嵌入式设备上一些流行的并可免费使用的Linux引导装载程序有Blob、Redboot和Bootldr(请参阅参考资料获得链接)。

所有这些引导装载程序都用于基于ARM设备上的Linux,并需要Jflash-linux工具用于安装。

一旦将引导装载程序安装到目标的闪存中,它就会执行我们上面提到的所有初始化工作。

然后,它准备接收来自主机的内核和文件系统。

一旦装入了内核,引导装载程序就将控制转给内核。

设置工具链

设置工具链在主机机器上创建一个用于编译将在目标上运行的内核和应用程序的构建环境—这是因为目标硬件可能没有与主机兼容的二进制执行级别。

工具链由一套用于编译、汇编和链接内核及应用程序的组件组成。

这些组件包括:

∙Binutils—用于操作二进制文件的实用程序集合。

它们包括诸如ar、as、objdump、objcopy这样的实用程序。

∙Gcc—GNUC编译器。

∙Glibc—所有用户应用程序都将链接到的C库。

避免使用任何C库函数的内核和其它应用程序可以在没有该库的情况下进行编译。

构建工具链建立了一个交叉编译器环境。

本地编译器编译与本机同类的处理器的指令。

交叉编译器运行在某一种处理器上,却可以编译另一种处理器的指令。

重头设置交叉编译器工具链可不是一项简单的任务:

它包括下载源代码、修补补丁、配置、编译、设置头文件、安装以及很多很多的操作。

另外,这样一个彻底的构建过程对内存和硬盘的需求是巨大的。

如果没有足够的内存和硬盘空间,那么在构建阶段由于相关性、配置或头文件设置等问题会突然冒出许多问题。

因此能够从因特网上获得已预编译的二进制文件是一件好事(但不太好的一点是,目前它们大多数只限于基于ARM的系统,但迟早会改变的)。

一些比较流行的已预编译的工具链包括那些来自Compaq(FamiliarLinux)、LART(LARTLinux)和Embedian(基于Debian但与它无关)的工具链—所有这些工具链都用于基于ARM的平台。

内核设置

Linux社区正积极地为新硬件添加功能部件和支持、在内核中修正错误并且及时地进行常规改进。

这导致大约每6个月(或6个月不到)就有一个稳定的Linux树的新发行版。

不同的维护者维护针对特定体系结构的不同内核树和补丁。

当为一个项目选择了一个内核时,您需要评估最新发行版的稳定性如何、它是否符合项目要求和硬件平台、从编程角度来看它的舒适程度以及其它难以确定的方面。

还有一点也非常重要:

找到需要应用于基本内核的所有补丁,以便为特定的体系结构调整内核。

内核布局

内核布局分为特定于体系结构的部分和与体系结构无关的部分。

内核中特定于体系结构的部分首先执行,设置硬件寄存器、配置内存映射、执行特定于体系结构的初始化,然后将控制转给内核中与体系结构无关的部分。

系统的其余部分在这第二个阶段期间进行初始化。

内核树下的目录arch/由不同的子目录组成,每个子目录用于一个不同的体系结构(MIPS、ARM、i386、SPARC、PPC等)。

每一个这样的子目录都包含kernel/和mm/子目录,它们包含特定于体系结构的代码来完成象初始化内存、设置IRQ、启用高速缓存、设置内核页面表等操作。

一旦装入内核并给予其控制,就首先调用这些函数,然后初始化系统的其余部分。

根据可用的系统资源和引导装载程序的功能,内核可以编译成vmlinux、Image或zImage。

vmlinux和zImage之间的主要区别在于vmlinux是实际的(未压缩的)可执行文件,而zImage是或多或少包含相同信息的自解压压缩文件—只是压缩它以处理(通常是Intel强制的)640KB引导时间的限制。

有关所有这些的权威性解释,请参阅LinuxMagazine的文章“KernelConfiguration:

dealingwiththeunexpected”(请参阅参考资料)。

内核链接和装入

一旦为目标系统编译了内核后,通过使用引导装载程序(它已经被装入到目标的闪存中),内核就被装入到目标系统的内存(在DRAM中或者在闪存中)。

通过使用串行、USB或以太网端口,引导装载程序与主机通信以将内核传送到目标的闪存或DRAM中。

在将内核完全装入目标后,引导装载程序将控制传递给装入内核的地址。

内核可执行文件由许多链接在一起的对象文件组成。

对象文件有许多节,如文本、数据、init数据、bass等等。

这些对象文件都是由一个称为链接器脚本的文件链接并装入的。

这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中;换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。

vmlinux.lds是存在于arch//目录中的内核链接器脚本,它负责链接内核的各个节并将它们装入内存中特定偏移量处。

典型的vmlinux.lds看起来象这样:

清单2.典型的vmlinux.lds文件

OUTPUT_ARCH()/*includesarchitecturetype*/

ENTRY(stext)/*stextisthekernelentrypoint*/

SECTIONS/*SECTIONScommanddescribesthelayout

oftheoutputfile*/

{

.=TEXTADDR;/*TEXTADDRisLMAforthekernel*/

.init:

{/*Initcodeanddata*/

_stext=.;/*Firstsectionisstextfollowed

by__initdatasection*/

__init_begin=.;

*(.text.init)

__init_end=.;

}

.text:

{/*Realtextsegmentfollows__init_datasection*/

_text=.;

*(.text)

_etext=.;/*Endoftextsection*/

}

.data:

{

_data=.;/*Datasectioncomesaftertextsection*/

*(.data)

_edata=.;

}/*Datasectionendshere*/

.bss:

{/*BSSsectionfollowssymboltablesection*/

__bss_start=.;

*(.bss)

_end=.;/*BSSsectio

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

当前位置:首页 > 农林牧渔 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1