嵌入式系统启动例程
嵌入式系统启动例程
通常PC在开机之后,会进入带有PC机厂商信息的BIOS画面,并且会显示出当前PC机的硬件信息,比如:内存大小,CPU信息等,它其实是PC机启动之后运行的第一段程序,它主要完成一些基本硬件初始化操作和硬件检测工作,保证拥有操作系统正常运行的软硬件环境,随后会加载并且启动操作系统。该段小程序是烧制到主板上的BIOS存储硬件里的。由此可见计算机系统在启动过程中必须依赖软硬件,在嵌入式系统中同样需要软硬件互相协调来完成启动过程。
1. 嵌入式系统启动 - 硬件支持
在嵌入式系统中,通常并没有像 BIOS 那样的固件程序,而是将用于引导系统的二进制映像文件(image文件)烧写到只读的ROM中,系统启动之后从ROM里加载并执行该映像文件。根据只读ROM类型的不同,启动方式也不尽相同。
嵌入式系统通常有两种启动方式:
(1)“硬盘”方式启动
所谓“硬盘”方式启动是指,启动程序被烧写在“硬盘”中,系统上电后CPU读取并执行“硬盘”中的指令数据,由于“硬盘”不支持随机寻址(支持向任意有效地址进行读写操作,硬盘里最小的寻址单元是扇区),并且读写速度太慢,通常是将“硬盘”中的引导程序指令数据拷贝到RAM(随机访问存储器)中,然后执行这些指令。
嵌入式系统中通常不使用PC机的硬盘作为文件存储器,而是使用类似硬盘的一些小容量Flash如Nandflash。S3C2440A处理器支持从Nandflash启动,这是由于S3C2440A Nandflash控制器中含有一个特殊的RAM – Stepping stone。
图2-38 Stepping stone原理图
当系统选择从Nandflash启动时,硬件会完成以下操作:
(a)通过Nandflash控制器将Nandflash中前4K的指令数据拷贝到Stepping stone中
(b)将Stepping stone所在地址0x40000000映射到0x0地址
(c)PC从0x0地址处取址执行
(2)ROM方式启动
以这种方式启动的系统通常会有一个专门用来存放启动程序的存储固件,当系统以该方式启动时,CPU直接从存储固件里运行启动程序。启动程序一般不会被擦除并且要求掉电时数据不能丢失,因此该存储固件通常是XIP(eXectute In Place片内可执行,代码不被压缩,并且支持随机寻址)类型的ROM(掉电非易失只读存储器)。嵌入式系统中经常使用Norflash作为启动程序存储固件。S3C2440同样也支持这种启动方式。
2. 嵌入式系统启动 - 软件支持
在嵌入式系统启动时,通常也有类似于BIOS的启动程序,该启动程序被称为Bootloader,由于Bootloader是被编译生成的,并且它的正确执行通常和系统硬件密切相关。
(1)二进制映像文件(image):
二进制映像文件是指烧写到ROM中的bin文件,也称为image文件。通常image文件是由编译器将源码编译而成的可执行二进制文件,源码中的语句,初始化变量,未初始化变量,和初始化为0的变量分别被编译成对应的操作指令和变量数据域,这些编译成的操作指令和变量数据域被链接器统一编址进image文件,作为image文件的输入。用户可以指定这些image文件的输入数据的属性,可以为只读的RO(Read-Only),可读写的RW(Read-Write)和初始化为0的ZI(Zero-Initial)。通常源码文件中含有以下属性数据段:
(a)只读属性RO的操作指令,如:控制语句,表达式
(b)只读属性RO的数据段,如:常量
(c)可读写属性RW的数据段,如:变量
(d)初始化为0的数据段ZI属性,如:初始化为0结构体
多个代码源文件具有相同属性的数据段为了方便存储器对其存储空间访问权限进行管理,通常被链接器放置在Image的相同位置,具有相同属性的输入数据段组成image文件的输出域。链接器允许用户指定每个image文件的输出域的起始地址。如图2-39所示。
图2-39 image文件结构图
(2)RAM中的执行程序:
外部存储设备上的image没有被加载到内存中时,和普通文件一样,是不能被执行的,image要想被CPU执行,必须要被程序加载器Load到内存中,并且设置好执行环境。
由于执行程序是内存中的image文件,因此二者内容是相同的,但还是有一些差别:
(a)image文件是存储在外部存储设备里的(嵌入式系统中通常是ROM,如:Nandflash,Norflash),而执行程序只能运行在内存RAM中。
(b)程序中初始化为0的变量(ZI数据段,也称为BSS数据段)在image文件里是不存在的变量要想被当前程序访问必须指定一个有效的内存地址,而未初始化的变量通常被设置为0,因此全部为0的数据是没有必要放到image文件里的,这样反而增加了image文件的体积。
由此可见,image文件被加载到内存之后,还要为ZI段准备地址空间来存放初始化为0的ZI数据段。
ZI段准备操作如下:
l 准备ZI数据段地址空间
l 将空间内容清0
对于运行在操作系统中的程序,该项工作可由操作系统的运行环境(程序加载器)来帮之实现,而对于没有操作系统的裸机程序,这项工作只能由RO段的代码自己实现,它也是启动程序最主要的一项工作之一。
|
评论暂时关闭