嵌入式linux系统开发概述Word文件下载.docx

上传人:b****1 文档编号:6075963 上传时间:2023-05-06 格式:DOCX 页数:19 大小:41.50KB
下载 相关 举报
嵌入式linux系统开发概述Word文件下载.docx_第1页
第1页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第2页
第2页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第3页
第3页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第4页
第4页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第5页
第5页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第6页
第6页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第7页
第7页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第8页
第8页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第9页
第9页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第10页
第10页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第11页
第11页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第12页
第12页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第13页
第13页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第14页
第14页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第15页
第15页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第16页
第16页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第17页
第17页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第18页
第18页 / 共19页
嵌入式linux系统开发概述Word文件下载.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式linux系统开发概述Word文件下载.docx

《嵌入式linux系统开发概述Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式linux系统开发概述Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。

嵌入式linux系统开发概述Word文件下载.docx

小的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初始化了一个芯片的最小系统,这是它另一个主要功能----检查基本硬件系统的设计是否正确。

 

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设计的。

设备驱动程序

嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动

轮、传感器、RS232接口、LCD等等。

除了这些设备外,还有许多其它专用设

备,包括闪存、USB、GSM等。

内核通过所有这些设备各自的设备驱动程序来

控制它们,包括GUI用户应用程序也通过访问这些驱动程序来访问设备。

开发者编写驱动程序是应该特别注意下面所提到的概念:

编写访问硬

件的内核代码是不要给用户强加任何策略。

因为不同的用户有不同的需求,

驱动程序应该处理如何使硬件可用的问题,而将怎样使用硬件的问题留给上

层应用。

因此,当驱动程序只提供了访问硬件的功能而没有附加任何限制时

,这个驱动程序就比较灵活。

然而,有时候我们也需要在驱动程序中实现一

些策略。

例如,某个数字I/O驱动程序只提供了以字节为单位访问硬件的方法

,这样就省去了编写额外代码以处理单个数据位的麻烦。

如果从另一个角度来看驱动程序,那么它可以被看作是应用和实际设备

之间的一个软件层。

这种定位使开发者可以选择如何展现设备特性:

即使对于相同的设备,不同的驱动程序也可以提供不同的功能。

实际的驱动程序设计应该在许多考虑因素之间取得平衡。

例如,某个驱动程序可能同时被多个进程使用,我们就应该考虑如何处理并发的问题:

可以在设备上实现独立于硬件功能的内存映射;

也可以提供一个函数库,以帮助应用程序开发者在已有原语的基础上实现新的策略。

总之,驱动程序的设计主要还是综合考虑下面三方面的因素:

提供给用户尽量多的选项、编写驱动程序占用较少的时间以及尽量保持程序简单而不至于错误丛生。

本节着重讨论通常几乎在每个嵌入式环境中都会使用的一些重要设备的

设备驱动程序。

4.1帧缓冲区驱动程序(FrameBuffer)

这是最重要的驱动程序之一,因为通过这个驱动程序才能使系统屏幕显

示内容。

帧缓冲区驱动程序通常有三层。

最底层是基本控制台驱动程序

drivers/char/console.c,它提供了文本控制台常规接口的一部分。

通过使

用控制台驱动程序函数,我们能将文本打印到屏幕上—但图形或动画还不

能(这样做需要使用视频模式功能,通常出现在中间层,也就是drivers-

/video/fbcon.c中)。

这个第二层驱动程序提供了视频模式中绘图的常规接

口。

帧缓冲区是显卡上的内存,需要将它内存映射到用户空间以便可以将图

形和文本能写到这个内存段上:

然后这个信息将反映到屏幕上。

帧缓冲区支持提高了绘图的速度和整体性能。

这也是顶层驱动程序引人注意之处:

顶层是非常特定于硬件的驱动程序,它需要支持显卡不同的硬件方面—象启用/禁用显卡控制器、深度和模式的支持以及调色板等。

所有这三层都相互依赖以实现正确的视频功能。

与帧缓冲区相对应的设备是/dev/fb0(主设备号29,次设备号0)。

可以用下面的命令来创建该设备:

#mknod/dev/fb0c290

有一个简单的比喻来理解帧缓冲驱动。

假设当前需要的显示分辨率是640x480x16bpp(16bpp代表16位色,一般的RGB排列为565,),那么要存储整个屏幕的像素信息所需要的内存大小为640x480x16/8=600Kbytes(一个像素的16位色需要两个字节来表示)。

帧缓冲驱动即在内存中分配了上述大小的一块区域,同时与实际屏幕上的像素一一对应。

如果我们要改变屏幕上某个像素的颜色显示,首先计算该颜色的16位的RGB排列,然后计算出该像素在内存中的偏移量,最后操作fb0设备,重画该像素。

下面的代码将屏幕上的第二排的第二个像素设置成白色:

{

intfd,pixel_addr,pixel_color,;

pixel_addr=(640+1)x16/8;

/*得到像素偏移地址*/

pixel_color=0xffff;

/*设置像素点颜色*/

fd=open(“/dev/fb0”,O_RDWR);

/*打开framebuffer设备*/

if(fd&

=0)

lseek(fd,pixel_addr,SEEK_SET);

/*找到该像素*/

write(fd,pixel_color,2);

/*重画该像素*/

}

现在一般的linux内核已经包含了对帧缓冲驱动的支持,我们要作的只是在内核配置选项中加入它:

#makemenuconfig(命令行下),或xconfig(XWindow下)。

与framebufferdevice有关的选项有(用空格键来进行选中或去除,其余编译选项请参考其它资料):

Codematuritylevelopetions

  Promptfordevelopmentand/orincompletecodes/drivers

  Consoledrivers

  Videomodeselectionsupport

  ...

  Supportforframebufferdevices

  VESAVGAgraphicsconsole

  Advancelowleveldriveroptions

  ...

[Exit]

Doyouwishtosaveyournewkernelconfiguration?

[Yes]

编译安装内核:

#makedep

#makebzImage

4.2输入设备驱动程序

可触摸板是用于嵌入式设备的最基本的用户交互设备之一—小键盘、传感器和滚动轮也包含在许多不同设备中以用于不同的用途。

触摸板设备的主要功能是随时报告用户的触摸,并标识触摸的坐标。

这通常在每次发生触摸时,通过生成一个中断来实现。

然后,这个设备驱动程序的角色是每当出现中断时就查询触摸屏控制器,并请求控制器发送触摸的坐标。

一旦驱动程序接收到坐标,它就将有关触摸和任何可用数据的信号发送给用户应用程序,并将数据发送给应用程序(如果可能的话)。

然后用户应用程序根据它的需要处理数据。

几乎所有输入设备—包括小键盘—都以类似原理工作。

输入设备驱动程序通常需要与上层的GUI应用接口。

比如触摸板需要和GUI的鼠标显示结合起来,随着用户触摸位置的不同,屏幕上鼠标的图标移动到相应的位置。

一般在GUI中有专门处理外部输入的文件,修改这些文件,可以支持自己的输入设备。

4.3闪存MTD驱动程序

MTD设备是象闪存芯片、小型闪存卡、记忆棒等之类的设备,它们在嵌入

式设备中的使用正在不断增长。

MTD驱动程序是在linux下专门为嵌入式环境开发的新的一类驱动程序。

相对于常规块设备驱动程序,使用MTD驱动程序的主要优点在于MTD驱动程序

是专门为基于闪存的设备所设计的,所以它们通常有更好的支持、更好的管

理和基于扇区的擦除和读写操作的更好的接口。

5

嵌入式设备的文件系统

系统需要一种以结构化格式存储和检索信息的方法,这就需要文件系统的参与。

文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。

Linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。

一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。

用户可以根据可靠性、健壮性和/或增强的功能的需求来选择文件系统的类型。

下一节将讨论几个可用选项及其优缺点。

5.1第二版扩展文件系统(Ext2fs)

Ext2fs是linux事实上的标准文件系统,它已经取代了它的前任—扩展文件系统(或Extfs)。

Extfs支持的文件大小最大为2GB,支持的最大文件名称大小为255个字符—而且它不支持索引节点(包括数据修改时间标记)。

Ext2fs做得更好;

它的优点是:

Ext2fs支持达4TB的内存。

Ext2fs文件名称最长可以到1012个字符。

当创建文件系统时,管理员可以选择逻辑块的大小(通常大小可选择1024、2048和4096字节)。

Ext2fs实现快速符号链接:

不需要为此目的而分配数据块,并且将目标名称直接存储在索引节点(inode)表中。

这使性能有所提高,特别是在速度上。

因为Ext2文件系统的稳定性、可靠性和健壮性,所以几乎在所有基于linux的系统(包括台式机、服务器和工作站—并且甚至一些嵌入式设备)上都使用Ext2文件系统。

然而,当在嵌入式设备中使用Ext2fs时,它有一些缺点:

Ext2fs是为象IDE设备那样的块设备设计的,这些设备的逻辑块大小是512字节,1K字节等这样的倍数。

这不太适合于扇区大小因设备不同而不同的闪存设备;

Ext2文件系统并没有提供对基于扇区的擦除/写操作的良好管理。

在Ext2fs中,为了在一个扇区中擦除单个字节,必须将整个扇区复制到RAM,然后擦除,然后重写入。

考虑到闪存设备具有有限的擦除寿命(大约能进行100,000次擦除),在此之后就不能使用它们,所以这不是一个特别好的方法;

在出现电源故障时,Ext2fs不是防崩溃的;

Ext2文件系统不支持损耗平衡,因此缩短了扇区/闪存的寿命(损耗平衡确保将地址范围的不同区域轮流用于写和/或擦除操作以延长闪存设备的寿命);

Ext2fs没有特别完美的扇区管理,这使设计块驱动程序十分困难。

由于这些原因,通常相对于Ext2fs,在嵌入式环境中使用MTD/JFFS2组合是更好的选择。

5.2用Ramdisk挂装Ext2fs

Ramdisk是通过将计算机的RAM用作设备来创建和挂装文件系统的一种机制,它通常用于无盘系统(当然包括微型嵌入式设备,它只包含作为永久存储媒质的闪存芯片)。

通过使用Ramdisk的概念,可以在嵌入式设备中创建并挂装Ext2文件系统(以及用于这一目的的任何文件系统)。

下面的操作创建一个简单的基于Ext2fs的Ramdisk:

#mke2fs-vm0/dev/ram4096

#mount-text2/dev/ram/mnt

#cd/mnt

#cp/bin,/sbin,/etc,/dev...filesinmnt

#cd../

#umount/mnt

#ddif=/dev/rambs=1kcount=4096of=ext2ramdisk

mke2fs是用于在任何设备上创建ext2文件系统的实用程序—它创建超级块、索引节点以及索引节点表等等。

在上面的用法中,/dev/ram是上面构建有4096个块的ext2文件系统的设备。

然后,将这个设备(/dev/ram)挂装在名为/mnt的临时目录上并且复制所有必需的文件。

一旦复制完这些文件,就卸装这个文件系统并且设备(/dev/ram)的内容被转储到一个文件(ext2ramdisk)中,它就是所需的Ramdisk(Ext2文件系统)。

上面的顺序创建了一个4MB的Ramdisk,并用必需的文件实用程序来填充它。

一些要包含在Ramdisk中的重要目录是:

/bin—保存大多数象init、busybox、shell、文件管理实用程序等二进制文件。

/dev—包含用在设备中的所有设备节点

/etc—包含系统的所有配置文件

/lib—包含所有必需的库,如libc、libdl等

5.3日志闪存文件系统,版本2(JFFS2)

瑞典的AxisCommunications开发了最初的JFFS,RedHat的DavidWoodhouse对它进行了改进。

第二个版本,JFFS2,作为用于微型嵌入式设备的原始闪存芯片的实际文件系统而出现。

JFFS2文件系统是日志结构化的,这意味着它基本上是一长列节点。

每个节点包含有关文件的部分信息—可能是文件的名称、也许是一些数据。

相对于Ext2fs,JFFS2因为有以下这些优点而在无盘嵌入式设备中越来越受欢迎:

JFFS2在扇区级别上执行闪存擦除/写/读操作要比Ext2文件系统好;

JFFS2提供了比Ext2fs更好的崩溃/掉电安全保护。

当需要更改少量数据时,Ext2文件系统将整个扇区复制到内存(DRAM)中,在内存中合并新数据,并写回整个扇区。

这意味着为了更改单个字,必须对整个扇区(64KB)执行读/擦除/写例程—这样做的效率非常低。

要是运气差,当正在DRAM中合并数据时,发生了电源故障或其它事故,那么将丢失整个数据集合,因为在将数据读

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2