嵌入式系统开机程式:RedBoot
文件类型:PDF/Adobe Acrobat 文件大小:字节
更多搜索:嵌入式 系统 开机 程式 RedBoo
嵌入式系统开机程式:RedBoot
陈思豪 曹世强 盈达
国立交通大学资讯科学系
新竹市大学路1001 号
TEL:(03)5712121 EXT. 56667
E-MAIL:{cschen, weafon, ydlin}@cis.nctu.edu.tw
摘要
开机程式是系统启动後的第一个执 的程式,其背负著将硬体初始与 进作业系
统的重大使命.开机程式的工作,在一般的PC上,大都分为BIOS与
BootManager(开机管 员) 段程式 完成,但是在嵌入式系统上因一般 无
BIOS的设计,因此通常以一段程式完成.我们通称此程式为Bootloader(开机
程式).Redboot是一个常用在嵌入式系统上的开机程式,其运作在Embedded
Configurable Operating System (eCos)这套作业系统的硬体描述层(Hardware
Abstraction Layer, HAL) 上.eCos是套以高 「可设定性」及「模组化」为目标
发展的嵌入式作业系统,Redboot可视为在其上开发的一套应用程式.eCos与
Redboot是个开放源码的计画,使用者 但可轻 的得到其原始码,且具备
Buyout-Free与loyalty-Free等优点,且可以从众多的贡献者处得到移植到新平台
的程式码,所以其支援广泛的硬体,相当具备有产品价值.
关键字: 开机程式,bootloader,RedBoot,eCos
1 简介
我们时常听到BIOS,BootManager,Bootstrap,Bootloader这几个跟开机程
式有关的名词,但却分 出到底有哪些差 .以一般常 的x86 PC系统为 ,
所谓的BIOS(Basic input output system 基本输出入系统) ,是指存在主机板上的
flash ROM上,负责许多与硬体沟通和初始化硬体的动作的程式.几乎每张主机
板都要有针对其特别写的BIOS.我们一般用其设定一些系统 如CPU频 ,
RAM的速 及抓取硬碟,光碟等周边.而所谓BootManager(开机管 员),其
像BIOS般,与硬体结合得如此紧密.在一般的x86机器上,一套BootManager
写好後可套用在所有的x86机器上,大部分存在硬碟主要开机磁区(Master Boot
Record, MBR).BootManager的工作是将OS的核心(Kernel)载入,有时还可从多
个硬碟分割区核心载入. 如在同一台电脑上 同时装上linux与Windows,我
们就可以靠著一套存在於MBR的BootManager 选择要载入linux或是
Windows.Bootstrap 就是我们 用 BootManager载入kernel後,OS开始做一
堆的初始动作直到我们可以开始使用,在这期间的一 动作.所以
BootManager也常称为Bootstrap Loader.至於Bootloader(开机程式)其实跟前
面 所提的BootManager几乎一样(也有许多人将这 词视为同意),主要任务就
是要 进kernel使系统进入bootstrap的动作.只是在嵌入式系统中常把BIOS与
BootManager做在一起,且也 需要选择OS这种功能,而把从电源一开启到
进kernel的所有动作统归为bootloader所负责.
所以在一般的PC架构中,我们常把开机分三个阶段 BIOS, BootManager,
OS.像是LILO (LInux boot LOader) and Grub (GRand Unified Bootloader) 这 个
都是在linux上广泛的bootmanager.他们负责透过BIOS所提供的IO功能,OS
从软碟或是硬碟 进 执 ,并具有多重OS选择功能,可开启所有在x86上的
OS.LILO是 史悠久,简单 用,而Grub提供 许多比LILO 强大的功能,
逐渐取代LILO的地位.而在嵌入式系统中则只分 阶段 Bootloader 及OS.常
的RedBoot (RedHat Embedded Debug and Bootstrap) 是一个所谓的
Bootloader,它也是本篇要介绍的主角.他能够提供嵌入式系统上的开机与除错
的工作.由於
没有BIOS的
帮忙,原本
Bootloader势
必有许多和硬
体平台相依的
动作.
RedBoot在这
边藉由 用eCos[2-5]这套嵌入式OS所提供的HAL而能够达到可一般BIOS所
做到的功能.某种层面 看,Redboot也可以 是一套eCos上的应用程式.
过其可载入各种在嵌入式系统上的应用程式, 限於是否是使用eCos开发的.
图1表示一般PC架构与嵌入式系统差
: 图1. 一般PC架构与嵌入式系统的开机步骤差
第二章介绍eCos这套嵌入式系统用的作业系统,包含其几个重要开发观
与功能,在其上开发的应用程式架构及其HAL在开机时对硬体所做的初始动
作.第三章介绍Redboot的功能,介绍其架构及其与eCos的关系,其运作的
程,当要移植到一个新的平台时所要注意的步骤等.最後是我们的结 .
1. eCos 介绍
2.1 eCos 简介
介绍redboot前,先介绍eCos这套针对嵌入式系统所设计的即时作业系统.
eCos(Embedded Configurable Operating System),是个开放原码的软体,开发者
可用GNU开放源码发展工具(GCC,GDB等)在其上的开发自己的应用程式,
其专 受eCos license所保护,这是一个GPL license的修改版,其准许开发者在
其上开发的应用程式(eCos以外自 撰写的部分)可以 用跟著GPL一起散布.
应用程式开发者可免费的取得其完整的源码(buyout-free),并针对其作任意的
修改与在其上开发自己的应用程式并散布,唯一的限制只是 有修改到eCos本
身,其需将修改的源码回报给eCos开发小组.当开发者将其当为产品时,也
需支付版税(royalty-free).其已直接支援 时下绝大部分的硬体,可在eCos官
方网站[2]上找到支援 表.
2.2 eCos功能概观
高可设定性
eCos最大的特色就是字面上C表示的「高可设定性」.eCos可以让开发者
像在玩积木般地自由选择其执 期的元件,应用程式开发者可以针对自己的应用
程式 设定一个对其最小的作业系统环境,这跟以往应用程式就是跑在一个完整
的作业系统上本质上 同,在嵌入式系统资源与记忆体寸土寸 的环境上,这样
的开发方式是很重要的.在以往的嵌入式开发方式都是自己手工的将作业系统作
缩减[1],对经验 足或对该作业系统 够熟悉的人将会花去许多时间,或是根
本很难将作业系统拆开,但在eCos上,由於设计之初就是朝向可设定的原则,
各种元件都遵守著模组化的开发方式,而应用程式开发者只要使用eCos所附的
设定化工具(图2),即可轻松简单的对eCos元件作 身打造,也 需对其内部
实作有所了解.
图2 eCos 设定工具
即时作业系统的核心并提供标准系统API
eCos的核心支援一般OS常 的项目如装置驱动程式(Device Driver),记
忆体管 (Memory managemant), 外处 (exception handling),中断处
(exception handling),执 绪的支援(thread support),计时器(Timer),计
器(Counter),对於即时作业系统的支援如完全优先(full preemptability),最小
中断延迟(minimal interrupt latencies),多样的同步方法(synchronization
primitive),可自订的排程原则(schedule policies).此外也支援POSIX等作业系
统的标准API及ANSI C与常用的 学函式.
支援常用的周边及通讯协定组( networking stacks)
支援以太网 卡, 埠,USB slave(被动式USB)等常用周边.并支援
一般常用的通讯协定组如IP,IPV6,ICMP,UDP,TCP,SNMP,HTTP,TFTP,
FTP等.网 设定部分,可将静态IP写死在程式中,或是透过DHCP自己抓取
IP. GDB 除错支援
可支援主控端使用GDB远端透过序 埠或是以太网 对应用程式除错.
2.3 eCos上开发的应用程式架构
图3中File system指的是对档案系统如ext2等的支援,library是上节所提
包括POSIX,ANSI C等的函式库.这张图,由上到下,表示从高层到底层的eCos
架构.最底层的是我们的硬体,在硬体上面有HAL与装置驱动程式,而我们大
部分会 用eCos设定工具去设定中间kernel,networking stack,library那层(OS
层),只 下我们需要的部分.最上层的应用程式就是我们自 撰写的部分,透
过中间OS层的辅助 达成我们的目的.由这张图,我们可以看出,Redboot是
一个架构在eCos HAL与Device Driver上的一套应用程式.
其中与硬体最关系密 的就
是HAL,可以用「最接近硬体的
软体」 形容,HAL将所有与硬
体相关的地方对外隐藏在 面.
针对 同的硬体时,只需抽换掉
HAL,换上针对新硬体而撰写的
HAL即可.下节将以x86为 ,
明eCos HAL在开机後作 哪些动作.
图3 eCos 应用程式架构图
2.4 eCos HAL
表1,以x86的平台为 , 明eCos HAL在开机时,会进 哪些细部动作.这
个起始化的动作的主要目的是要初始CPU,RAM,周边,使在HAL之後的程式
可正确无误的执 ..
步骤名称 解释
1. CPU INIT 初始CPU,这 主要是对一些与CPU有关的暂存器作一些
处 .
2. SMP INIT 对SMP(symmetric multiprocessor 对称式多处 器)的支
援,在某些平台这部分会拿掉.
3. DIAG INIT 作定义一些诊断系统目前 态用的巨集.
4. MMU INIT 对记忆体管 所做的初始化,主要是为 处 虚拟记忆体
位置与真实记忆体位置间的转换.
5. MEMC INIT 在x86系统中会开启A20 gate,这个与x86记忆体定址有
悠久 史渊源的东西.
6. INTC INIT 将所有的中断预设为关闭.
7. CACHE INIT 将CPU的快取系统作初始.
8. TIMER INIT 初始系统的计时器.
9. IDT INIT 设定IDT(Interrupt Descriptor Table 中断描述表格)以初
始中断堆叠区段,以後有中断发生时就会使用到这些区段.
10. MON INIT 当程式是放在ROM中被执 时,这个函式会去确定所有
外情形的 外处 器是否皆已装设.
11. FPU INIT 初始许多与浮点运算单元相关的暂存器.
12. BSS INIT 会去清除记忆体中的BSS 区段,BSS会放所有被宣告成静
态(static)的变 .
13. ROM INIT 在这边会检查程式本身是否被放在ROM上被执 ,如果
是的话需要将程式中的资 区段拷贝到RAM上.
14. STACK INIT 设定堆叠使我们可以call c 函式.在这个步骤之前执 的
全是组合语言,这步过後就可以开始呼叫C的函式 .
15. PLATFROM
INIT
初始virtual vector table,virtual vector是使用在eCos 上用
指向许多资 与函式的指标.
16. GDB_STUB
INIT
如果需要有与主控端的GDB作除错的动作的话,就会安装
与除错相关的trap与初始相关硬体.
17. GOTO
PROGRAM
总算HAL的初始硬体的部分大功告成,这时已经具备足够
的环境给Redboot此 应用程式 .
表1 eCos HAL 初始步骤
2. RedBoot 介绍
3.1 功能
初始CPU ,RAM及周边介面:
这 就相当於x86上BIOS的功能,初始CPU包括对於SMP(Symmetric
Multiprocessing 对称式多处 器),FPU(Floating point unit 浮点运算单元),Cache
(快取)等初始动作. RAM大部分是决定其大小及决定要使用哪些区段.周边
是如网 卡,序 埠等装置. 初始一个让OS或应用程式(Application, AP)执 的环境:
许多OS或是Application是用C写成的,我们熟悉的开发环境也是C或是
JAVA这 高阶语言,但是实际上要执 这些语言写成的程式都必须有环境,如
JAVA需要JVM,C需要初始stack,而bootloader又是第一个执 的程式,因此
bootloader前面初始化的部分都是用组语写成.直到它初始化 一个可以如C这
种高阶语言可以执 的环境後,之後才可呼叫用C写成的函式. 过许多的OS
会自己做这些动作(因为这就是OS的所负责的),bootloader大部分是为 让自
己後 执 的功能造出最低限 的环境即可.除 上面以外,如果bootloader自
己需要或是任何 进OS前有需要用到IO的动作,bootloader就必须提供IO的
介面与环境.
将OS或AP载入记忆体执
这是bootloader存在的意义,它初始化系统就是为 做这件事,把我们要执
的东西从某处,可能是ROM或是硬碟或是软体或光碟,将其放到RAM中,
并执 它.做 执 的动作後,如果被执 的是个OS,一般 就 会回 ,
主控权就交给 OS,自己就功成身退 .以Redboot ,可将我们开发好的
AP从以太网 ,序 埠(透过X/Y modem),USB,软碟,硬碟等,各种经过
正常初始化的装置,下载到目标硬体的记忆体中执 .至於以太网 的设定,除
能事先设定外, 可支援在开机时,以BOOTP/DHCP取得.
Redboot当然也能支援多重OS开机及开机执 批次档(booting script file)
的功能.当我们确定开机後会有一 将被执 时,可以在设定Redboot时,
直接写死在 面,这样Redboot就会自动在开机时,执 那一 的指 .
除错器支援与应用程式监控
而许多用在嵌入式系统上的bootloader如Redboot就加上 GDB的功能,可
以透过序 埠或是透过区域网 与主控端沟通,主控端通常为一台PC,可以
透过萤幕对载入执 的AP或是OS做监控与除错的动作.Redboot实作 eCos
中关於GDB 接器的部分,当起始 周边,如以太网 卡或是序 埠後,主控
端可以远端透过这些介面,用GDB对我们载入的程式作除错的动作.
此外Redboot内建 一个 似UNIX系统上shell的指 式介面(command line
interface),使用者可以透过本地端键盘,以太网 , 埠对Redboot下命 ,
常用的 如上述从指定的周边载入
程式到记忆体中,执 记忆体某个区
段的程式,秀出某段记忆体区段等.
这个介面还支援 别名(alias)的功
能,可替较长或较难记的指 设定别
的指 名.
3.2 架构
图4大部分的元件都是在上面的功能概观上提过的.这个图就是图一中把
RedBoot区块展开,再加上底层如HAL的部分.底层最接近硬体的部分为HAL
与装置驱动程式如以太网卡,序 埠,Flash ROM的驱动等,中间这层即前面提
到的OS层,是由eCos精简而 .上面的CLI与X/Y modem可看成RedBoot
特别另外撰写,也就是应用程式层的部分.
图4. Redboot 架构图
3.3 程式 程
图5 Redboot 程式 程图
图五显示Redboot的程式运作 程图.首先,是我们之前3.1节介绍过的
HAL起始化,再 会去检查系统的IO,virtual vector等是否正确初始化 ,接
著定义RAM中的工作区域,然後作开机後测试(Power On Self Test, POST),就
像一般PC上看到BIOS在作测试RAM那 的动作.接下 会执 开机执 序
批次档,与进入CLI.在使用者输入指 後,Redboot递回的找寻别名,接著
执 该命 .这张图 出Load,Go与Other三种指 的 程,Load就是将程式
透过前面所述的各种介面 入记忆体中,Go是执 程式,一般 开始执 程
式後就 会跳回开机程式 ,有时会看到可以按ctrl+c从程式跳出 的情形,这
大部分是靠著拦截键盘中断,实作出 的.
3.4 平台移植
Redboot已经支援 许多硬体 ,但 我们要将其移植到一个全新的硬体时,
我们也只要 改与硬体相关的部分就可以 .在eCos中,与硬体相关的部分只
有图一中第二层的HAL与驱动程式装置,而以上的核心,函式库,网 部分的
实作几乎都是 需 动的.比起移植整套的eCos到新的平台,如果光是移植
Redboot的话,那麼 需完成全部的HAL也能让Redboot跑起 ,并可确保基本
部分硬体都有正常运作.Redboot启动後,我们就可透过GDB远端除错,所以
移植Redboot也可当成是移植任何eCos应用程式的前置作业.
在移植Redboot时,我们会先试著将其以从RAM启动的方式试著执 ,这
的意思就是在Reboot前还存在一个别的开机程式或是BIOS之 的另一套软
体 将Redboot 入并执 ,其中就差在是否Redboot自己可将系统作初始化而
用原有的开机程式或BIOS 作,如果Redboot已经可以完全的取代 原 的
开机程式 放到ROM中当成唯一的开机程式时,那麼我们就称其为ROM
Monitor.
针对新的硬体编写HAL,必须只少看懂eCos其中一套的HAL实作方式,
并对目标硬体有相当的了解,且需要许多经验的 积,移植程式到新硬体上的工
作都是很苦的,没 麼速成的指引,以下也只是 出概 上几个必须完成的事.
1. 先找出一个与目标硬体最接近的成品HAL当作我们移植的样版.
2. 改HAL中的记忆体配置使其与目标硬体相同.
3. 改HAL中IO的部分.
4. 关於快取与记忆体管 单元的部分对Redboot 还 太需要,为 将问题
简单化可先把这麻烦的部分先拿掉.
5. 至少要实作一个可让我们与其沟通的介面,如以太网 或序 埠.
6. 实作与平台相关的一些初始化动作(如1.4节所述),这项就是前述的Redboot
是否可以成为该平台的ROM monitor的条件,反之 只是被 进RAM执
的话,这个步骤就还 需作.
如果以RAM启动方式已经可的话,可以试著将原有的Bootloader备份下 ,换
上Redboot看看其是否可以当Rom monitor,这部分除错如没有ICE之 的硬体
除错器会相当辛苦.成功的话,表示已经有 一份基础的HAL成形 .
3. 结
嵌入式系统用的开机程式 需要和一般PC用开机程式一样分成 阶段,因
为程式的 源通常是固定的, 能也 需要让使用者选择.而能够存放在ROM
中,第一个被系统执 的软体,又能够 入其他程式并执 者,我们称其为该目
标硬体的ROM monitor,具有初始化硬体的能 ,其中定具有可使用在此目标硬
体的上HAL.RedBoot结合eCos的HAL後是一套完整的嵌入式系统用开机程
式,其支援多种硬体,又可对 进 的程式作监控除错的动作,对於开发阶段
是 可或缺的工具.而以产品化而言,开发者可以轻 取得完整程式码作修
改,再搭配eCos设定工具我们可轻松打造出精简短小最适合我们用途的开机程
式.要将RedBoot移植到全新的平台上时,由於硬体相关与非硬体相关的部分分
的非常清楚,所以只要针对新的平台重新撰写HAL即可.
4. 考资
[1] 元彪, 盈达; 「Linux嵌入式系统减肥实作」; 网 通讯;134期,2002
9月.
[2] eCos web site , http://sources.redhat.com/ecos/
[3] eCos v2.0 Documentation ,"User Guide",
http://sources.redhat.com/ecos/docs-2.0/user-guide/ecos-user-guide.html
[4] eCos v2.0 Documentation , "eCos Reference Manual" ,
http://sources.redhat.com/ecos/docs-2.0/ref/ecos-ref.html
[5] Anthony Massa, "Embedded software development with eCos" ,
http://www.phptr.com/browse/product.asp product_id={0BEE58C4-0812-4B13-9B8
C-A0FC31A4C02F}
·上一篇:高雄市资讯种子学校教师运用PDA支援教学的认知意愿研究
·下一篇:骄阳-I型PDA
