大学毕业设计(论文) 本章首先介绍了嵌入式ARM-Linux系统的组成,并简要介绍了Linux操作系统的历史及Linux操作系统在嵌入式领域的应用。介绍了S3C2410的功能,并对SDRAM存储接口电路、NANDFLASH存储电路、电源模块、USB电路模块和LCD电路模块的设计进行了说明。对系统各组成部分功能作了简要说明,对系统主要技术指标、性能及结构特点亦作了简要介绍。
3 Linux系统的建立
本设计采用的是嵌入式Linux系统,嵌入式Linux(Embedded Linux)是指对Linux经过裁剪小型化后,可固化在存储器或单片机中,应用于特定嵌入式场合的专用Linux操作系统。Linux做嵌入式的优势:首先,Linux是开放源代码,是遍布全球的众多Linux爱好者和Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新速度很快,Linux可以定制,其系统内核最小只有约134KB;第三,Linux是免费的OS,在价格上极具竞争力。Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统。到目前为止,它可以支持二三十种CPU。而且性能稳定,裁剪性很好,开发和使用都很容易,移植性很强,移植的速度远远超过Java的开发环境,即用Linux环境开发的产品,二次开发方便。
同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持,提供了包括十兆、百兆、千兆的以太网络,以及无线网络、Toker ring(令牌环网)、光纤甚至卫星的支持。还有使用Linux开发无线连接产品的开发者越来越多。
3.1 Linux的启动过程
嵌入式Linux的启动流程大概如下:
第一阶段,用户上电,CPU进入自动实模式,通常是从ROM-BIOS的地址0xffff0开始执行代码,按BIOS中设置的启动设备进行启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux。
第二阶段,Linux首先进行内核的引导,主要完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。
第三阶段,执行init系统初始化工作,init程序调用了rc.sysinit和rc等程序,而rc.sysinit和rc在完成初始化和运行服务的任务后,返回init。
第四阶段,init启动mingetty,打开终端供用户登录系统,用户登录成功后
—13—
大学毕业设计(论文) 进入了shell,这样就完成从开机到登录的整个启动过程。
参数 内核 文件系统 应用程序 图3.1 Linux系统各部分软件图
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:
(1)引导加载程序。包括固化在固件中启动代码和Bootloader两大部分。 (2)Linux内核。特定于嵌入式电路板的内核以及控制内核引导系统的参数。
(3)文件系统。包括根文件系统和建立于Flash内存设备上的文件系统,一般有RAMDISK、CRAMFS和YAFFS等。
(4)用户应用程序。特定于用户开发的应用程序。
第 四 阶 段 完成 —14—
BootLoader 上电 第 一 阶 段 Grub/lilo 第 二 阶 段 第 三 阶 段 Mingetty Login Kernel rc.sysinit BIOS Init Rc Shell 大学毕业设计(论文) 图3.2 Linux启动流程图
3.2 启动代码和BootLoader
引导加载程序是系统加电后运行的第一段代码,对嵌入式系统来讲是一个非常重要的系统组成部分。但在嵌入式系统中,一般并没有像PC中BIOS那样的固件程序,因此在一般的系统中,整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM嵌入式系统中,系统上电或者复位时通常都从0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader,通过这小段程序可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做准备。
BootLoader的启动过程可以是单阶段的,也可以是多阶段的。大多数单阶段的BootLoader应用于简单的系统,一般为没有操作系统的系统。通常多阶段的BootLoader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的BootLoader大多数是两阶段的启动过程,也就是启动过程可以分为stage1和stage2两部分:
(1)Stage1为启动代码,它是CPU上电后执行的第一段代码负责初始化最原始的硬件资源,例如屏蔽CPU中断、工作频率、内存参数和设置堆栈等。由于在初始化原始硬件资源之前程序是直接控制CPU工作,所以该部分的启动代码必须要用汇编语言编写。
(1)Stage2是紧接着启动代码之后的程序,负责初始化本阶段要用到的硬件资源,例如UART,RAM,ROM,USB,LCD等;为内核设置启动参数:还要提供一定的命令行接口,用于进行系统调试,最后要负责引导操作系统。由于涉及复杂的功能,所以通常用C语言编写,C语言入口点由上一级启动代码引导进入。
大多数BootLoader都包含两种不同的操作模式:启动加载(Boot loading)模式和下载(Down loading)模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
(1)启动加载模式:这种模式也称为自主(Autonomous)模式,即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程没有用户的介入。这种模式是BootLoader的正常工作模式。在嵌入式产品发布的时候,BootLoader显然必须工作在这种模式下。
—15—
大学毕业设计(论文) (2)下载模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机上下载文件,比如下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的固态存储设备中,BootLoader的这种模式通常在系统更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口,比如U-Boot、Blob、VIVI等。
BootLoader是依赖于硬件实现的,特别是在嵌入式系统中。不同体系结构需求的BootLoader是不同的,除了体系结构,BootLoader还依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们基于相同的CPU构建,运行在其中一块电路板上的BootLoader未必能够运行在另一块电路开发板上,要使之后的软件系统能正常地运行起来,就必须确保BootLoader能正确地从ROM中被读取运行,并且具备引导操作系统的能力,所以要对BootLoader进行正确移植和修改。
由上所述可知,BootLoader是嵌入式系统中重要的一部分,目前流行的BootLoader主要有:
(1)U-BOOT。U-BOOT是德国DENX小组开发的用于多种嵌入式CPU的BootLoader程序,它可以运行在基于PowerPC、ARM、MIPS等多种嵌入式开发板上。从http://U-BOOT.sourceforge.net/或ftp;//ftp.denx.de/pub/U-BOOT/站点都可以下载U-BOOT的源代码。
(2)VIVI。VIVI是由韩国MIZI公司开发的专门用于ARM产品线的一种BootLoader。因为VIVI目前只支持使用串口和主机通信,所以必须使用一条串口电缆来连接目标板和主机。VIVI的源代码下载地址为http;//www.mizi.com/developer/S3C2410x/download/vivi.html。
(3)Blob。Blob是Boot Loader Object的缩写,是一款功能强大的BootLoader。其源码在http;//sourceforge.net/projects/blob上可以获取。Blob最初是由Jan-Derk Bakker和Erik Mouw两人为一块名为LART(Linux Advanced Radio Terminal)的开发板所写,该板使用的处理器是StrongARM SA-1100,现在Blob已经被成功地移植到许多基于ARM的CPU上。
(4)RedBoot。RedBoot是一个专门为嵌入式系统定制的引导启动工具,最初由Redhat开发,它是基于eCos(Embedded Configurable Operating System)的硬件抽象层,同时它继承了eCos的高可靠性、简洁性、可配置性和可移植性等特点。RedBoot集BootLoader、调试、Flash烧写于一体,支持串口、网络下载,执行嵌入式应用程序。既可以用在产品的开发阶段(调试功能),也可以用在最终的产品上(Flash更新、网络启动)。RedBoot支持下载和调试应用程序,开发板可以通过BOOTP/DHCP协议动态配置IP地址,支持跨网段访问。
—16—
大学毕业设计(论文) 用户可以通过tftp协议下载应用程序和image,或者通过串口用x-modem/y-modem下载,在嵌入式系统应用中非常广泛。
(5)ARMboot。ARMboot是一个以ARM或StrongARM为内核CPU的嵌入式系统的BootLoader固件程序,该软件的主要目标是使新的平台更容易被移植并且尽可能地发挥其强大性能。它只基于ARM固件,但是它支持多种类型的启动,比如Flash,网络下载通过bootp、dhcp、tftp等。它也是开源项目,可以从http;//www.sourceforge.net/projects/armboot网站获得最新的ARMboot源码和详细资料,它在ARM处理器方面应用非常广泛。
(6)DIY。DIY(Do It Youself),即自己制作。以上U-BOOT、VIVI、Blob、RedBoot和ARMboot等成熟工具移植起来简单快捷,但它们都存在着一定的局限性。首先,它们是面向大部分硬件的工具,在功能上要满足大部分硬件的需求。一般情况下,我们只需要与特定的开发板相关的实现代码,其他型号开发板的实现代码对它来说是没有用的,所以通常它们的代码量较大。其次,它们在使用上不够灵活。比如,在这些工具上添加自己的特有功能相对比较困难,必须熟悉该代码的组织关系,以及了解它的配置编译等文件。用DIY的方式自己编写针对目标板的BootLoader不但代码量短小,同时灵活性很大,最重要的是将来容易维护。因此,在实际嵌入式产品开发时大都选择DIY的方式编写BootLoader。
3.3 U-BOOT的简介
U-BOOT的全称为Universal Boot Loader,是遵循GPL(GNU General Public License)协议的开放源码项目。该条款规定开发者必须开放源代码,确保用户可以自由地共享和修改软件,目的是促进软件知识的自由传播。不少U-BOOT源代码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序。U-BOOT不仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks,QNX,RTEMS,ARTOS,LynxOS等操作系统,所以本设计打算选用此Boot Loader。
U-BOOT源代码是由多个目录组成的GNU项目,在不同的目录中按功能分类存放了C语言的代码文件,其主要目录结构如下:
Board:U-BOOT所支持目标开发板相关文件。主要包含SDRAM和Flash的驱动程序;
Common与处理器体系结构无关的通用代码,如内存大小探测与故障检测,在这里主要关注cmd_boot.c和cmd_bootm.c;
Cpu:与处理器相关的文件,如ARM920t子目录下含S3C2410的串口、IIC
—17—