嵌入式linux系统开发概述文档格式.docx
《嵌入式linux系统开发概述文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式linux系统开发概述文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
常用的引导程序有LILO或GRUB,通常将它们装入硬盘的主引导记录(MasterBootRecord)中,或者装入linux驻留的磁盘的第一个扇区。
在嵌入式系统中,情况有些不同。
首先,嵌入式设备通常需要经常地移
动,考虑到在移动过程中的震动,一般不会采用机械式结构设计的硬盘为存
储设备;
而且从成本控制上说,硬盘的价格比较高,除非是需要大容量存储
的场合,硬盘不适合作为嵌入式设备的存储介质。
目前采用得比较多的是闪
存设备,闪存设备是与存储设备功能类似的特殊芯片,而且它们能持久存储
信息----即在重新引导时不会擦除其内容,Flash、DiskonChip和Compact
Flash卡就是使用得比较多的这类设备。
另外,由于一般嵌入式设备上只会有
一个操作系统,所以bootloader的主要功能有所变化,不再是用来选择操作
系统,而是为了更快地在存储介质上下载linux内核和文件系统(filesystem
包含了图形用户界面等应用程序,将在后面介绍)。
这是因为我们一般通过芯
片的JTAG口来实现引导程序的装载,JTAG口的速度比较慢,对于只有十几K大
小的bootloader来说,装载的时间不会很长,可是针对一个功能完善的嵌入
式设备,比如PDA,它的软件系统包括了linux内核和以上的各种应用,加在
一起最少都会有十几兆,如果都通过JTAG来下载的话,恐怕几个小时都是不
够用的。
而且通常内核和应用需要多次的修改和调试才得到最终的成熟的版
本,如此频繁的下载要都通过JTAG来实现,显然是不现实的。
因此,为了解
决这个问题,通常的做法是在bootloader中实现网卡或USB的驱动,通过网络
或USB接口来实现软件的下载功能。
目前流行的并可免费使用的linux引导装载程序有Blob、U-boot、Redboot和Bootldr,它们可以广泛地应用在X86、ARM、PPC和MIPS等平台上,对于基于ARM核设计的PXA255芯片,当然也是适合的。
前面提到bootloader可以通过芯片的JTAG口下载到闪存上的,PXA255采用的就是这种方式。
这种方式需要专用软件。
专用软件可以直接与目标机(在嵌入式开发中,嵌入式设备通常被称为目标机)上的闪存设备进行交互并将引导装载程序安装在闪存的给定位置中。
这个软件使用目标系统上的JTAG端口,JTAG是用于执行外部输入(通常来自主机,及用作开发的PC机系统)的指令的接口。
JFlash-linux就是一种用于直接写闪存的流行工具。
它支持为数众多的闪存芯片;
它在主机上执行并通过使用主机的并行端口与目标系统的JTAG接口访问目标的闪存芯片。
当然,这意味着需要有专门的用来连接目标机JTAG口和主机并行接口的通讯线。
主机和目标机的连接方式见图1.1所示。
图1.1目标机JTAG和主机并行端口的连接
Jflash-linux在linux和windows版本中都可使用,可以在命令行中用以下命令启动它:
#Jflash-linux&
lt;
bootloader&
还有某些种类的嵌入式芯片具有微小的引导代码----根据几个字节的指令----它将初始化一些DRAM设置并启用目标机上的一个串行(或者USB,或者以太网)端口与主机程序通信。
然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标机上,并将它写入闪存。
在引导程序已装载并给予其控制后,这个引导装载程序执行下列各类功能:
初始化CPU速度
初始化内存,包括启用内存库、初始化内存配置寄存器等
初始化串行端口(如果在目标上有的话)
启用指令/数据高速缓存
设置堆栈指针
设置参数区域并构造参数结构和标记(这是重要的一步,因为内核在标
识根设备、页面大小、内存大小以及更多内容时要使用引导参数)
执行POST(加电自检)来标识存在的设备并报告任何问题
为电源管理提供挂起/恢复支持
跳转到内核的开始
可以看出,bootloader初始化了一个芯片的最小系统,这是它另一个主要功能----检查基本硬件系统的设计是否正确。
2
Linux内核
Linux的源代码组织非常复杂,幸好我们不用将它们完全弄懂,现在我们需要的是知道各个部分的大致功能,然后再在以后开发过程中,针对不同的系统需求,修改内核中特定的某个部分就可以了。
下面首先来看看是linux源码文件的组织结构:
kernel/
linux内核(非常小)
lib/
各种内核需要使用的库文件
MAINTAINERS
内核各部分的维护者
mm/
内存管理单元
net/
网络系统
README
readme文件
REPORTING_BUGS
报告bug的指导
scripts/
一些脚本
security/
安全模式的实现
sound/
声卡支持和驱动
usr/
工具
arch/
硬件相关代码
COPYING
linux拷贝条件(GNUGPL)
CREDITS
linux的主要贡献者
crypto/
密码库
Documentation/
内核文档
drivers/
驱动程序
fs/
文件系统
include/
内核头文件
include/asm-&
arch&
硬件相关的头文件
include/linux
内核核心的头文件
init
linux初始化代码
ipc/
进程间通讯
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”。
3
工具链(Toolchain)
设置工具链在主机机器上创建一个用于编译将在目标上运行的内核和应
用程序的构建环境—--这是因为目标硬件可能没有与主机兼容的二进制执行级别。
工具链由一套用于编译、汇编和链接内核及应用程序的组件组成。
这些组件包括:
Binutils—用于操作二进制文件的实用程序集合。
它们包括诸如ar、as、objdump、objcopy这样的实用程序;
Gcc—GNUC编译器;
Glibc—所有用户应用程序都将链接到的C库。
避免使用任何C库函数的内核和其它应用程序可以在没有该库的情况下进行编译。
构建工具链建立了一个交叉编译器环境。
本地编译器编译与本机同类的处理器的指令。
交叉编译器运行在某一种处理器上,却可以编译另一种处理器的指令。
从头设置交叉编译器工具链可不是一项简单的任务:
它包括下载源代码、修补补丁、配置、编译、设置头文件、安装以及很多很多的操作。
另外,这样一个彻底的构建过程对内存和硬盘的需求是巨大的。
如果没有足够的内存和硬盘空间,那么在构建阶段由于相关性、配置或头文件设置等问题会突然冒出许多问题。
因此能够从因特网上获得已预编译的二进制文件是一件好事(但不太好的一点是,目前它们大多数只限于基于ARM的系统,但迟早会改变的)。
一些比较流行的已预编译的工具链包括那些来自Compaq(FamiliarLinux)、LART(LARTLinux和Embedian(基于Debian但与它无关)的工具链—所有这些工具链都用于基于ARM的平台。
Intel的PXA255芯片就是基于ARM设计的。
4
设备驱动程序
嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动
轮、传感器、RS232接口、LCD等等。
除了这些设备外,还有许多其它专用设
备,包括闪存、USB、GSM等。
内核通过所有这些设备各自的设备驱动程序来
控制它们,包括GUI用户应用程序也通过访问这些驱动程序来访问设备。
开发者编写驱动程序是应该特别注意下面所提到的概念:
编写访问硬
件的内核代码是不要给用户强加任何策略。
因为不同的用户有不同的需求,
驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上
层应用。
因此,当驱动程序只提供了访问硬件的功能而没有附加任何限制时
,这个驱动程序就比较灵活。
然而,有时候