• 休闲生活
  • 教育教学
  • 经济贸易
  • 政法军事
  • 人文社科
  • 农林牧渔
  • 信息科技
  • 建筑房产
  • 环境安全
  • 当前位置: 达达文档网 > 达达文库 > 休闲生活 > 正文

    嵌入式实时操作系统加载方式研究

    时间:2020-09-19 07:54:51 来源:达达文档网 本文已影响 达达文档网手机站

    摘要摘要:随着数字信息技术的发展,嵌入式实时操作系统不仅渗透到科学研究、工程技术等领域,而且与人们的生活联系越来越密切。嵌入式实时操作系统最重要的特性是加载方式需要调度一切可利用的资源完成实时任务。为正确评价嵌入式实时操作系统的性能,必须通过科学、系统的方法对其进行研究,进行全面、准确的测试。探讨Flash、RAM和外部存储介质启动的内存映射布局,讨论3种加载方式的优劣,结合硬件平台测试各项启动性能。

    关键词关键词:Bootloader;内存映射;加载方式;嵌入式操作系统

    DOIDOI:10.11907/rjdk.1511245

    中图分类号:TP302

    文献标识码:A文章编号文章编号:16727800(2016)001001903

    0引言

    嵌入式系统应用越发广泛,从软件的角度,一个嵌入式系统可以分为4个层次:①引导加载程序。包括固化在固件中的 boot 代码和BootLoader两大部分;②内核。嵌入式操作系统是嵌入式应用软件的基础和开发平台,它解决了嵌入式软件开发标准化的难题。嵌入式系统具有操作系统最基本的功能。目前,主流的嵌入式系统有以下几种:Linux、VxWorks、QNX、Windows CE、Palm OS;③文件系统。包括根文件系统和建立于 Flash 内存设备之上的文件系统;④用户应用程序。在用户应用程序和内核层之间可能还存在一个嵌入式图形用户界面。常用的嵌入式GUI有Qt和MiniGUI等。

    引导加载程序是系统加电后运行的第一段软件代码。从 PC 的体系结构中可知,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(如LILO和GRUB等)组成。BIOS 在完成硬件检测和资源分配后,将硬盘MBR 中的 Boot Loader 读到系统RAM 中,然后将控制权交给 OS Boot Loader。Boot Loader 的主要任务是将内核映象从硬盘读到 RAM 中,然后跳转到内核的入口点运行,即开启操作系统。 而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(有的嵌入式 CPU 也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。比如在一个基于ARM920T核心的 S3C2410 CPU的嵌入式系统中,系统在上电或复位时通常从地址 0x00000000 处开始执行,由系统的 Boot Loader 程序[12]执行。

    本文将从典型嵌入式系统内存映射布局、常见嵌入式操作系统的加载方式、Boot Loader 的框架结构以及 Boot Loader 的安装等4个方面讨论嵌入式系统加载方式。

    1典型嵌入式系统内存映射布局

    一个典型的嵌入式系统至少具备以下3类存储部件。

    (1)Boot ROM 是一片可擦写的只读存储器,一般不会太大(大小不超过1M),用于存放嵌入式系统加电后的初始化代码。在PC上,用于完成加电后检测的BIOS,功

    能与此类似。

    (2)Flash是一块可擦写的存储介质,用于嵌入式系统的操作系统和应用程序映像,以及嵌入式系统的配置数据等。此介质的容量大于Boot ROM。

    (3)SRAM/DRAM即常规内存。一般情况下,嵌入式系统启动后,执行的代码和数据存放于此。

    这3类存储介质,一般直接通过硬件连接方式,硬性焊接在CPU的可寻址空间中,如图1所示。因此,只需采用CPU的内存读写机制,就可以完成对这些设备的读写操作,无需特殊设备驱动程序的支持。

    2嵌入式操作系统加载方式

    2.1从Flash直接加载

    在这种加载方式下,嵌入式操作系统映像和应用程序映像都存放在Flash中。编译时,操作系统和应用程序映像的二进制模块被编译成不同的节,包括TEXT节、DATA节、BSS节等。其中,不同节存的内容也不同,TEXT节存放可执行代码,DATA节存放已经初始化的全局变量,而BSS节是一个预留节,存放未经初始化的全局变量。嵌入式系统加载启动过程如图2所示。

    (1)完成CPU复位,执行启动向量所在的第一条指令(位于Boot ROM内),这条指令往往是一条跳转指令,跳转到Boot ROM内的硬件初始化代码位置,执行必需的硬件初始化工作。

    (2)硬件初始化代码完成CPU的初始化,比如设置CPU的段寄存器、堆栈指针等,以及其它硬件的初始化。

    (3)完成硬件的初始化功能后,通过一条跳转指令,跳转到Flash存储器的特定位置开始执行。这个位置是一段代码段(TEXT段)中的一个特定位置。

    (4)将Flash中的DATA节代码复制到RAM中。

    (5)完成DATA节的复制后,Flash中的代码会根据BSS节的大小,在RAM中预留相应的内存空间,留给未初始化的变量使用。

    完成上述功能后,嵌入式系统的执行环境准备完毕,进入操作体统初始化阶段。

    2.2从RAM中加载

    与从Flash直接加载方式不同,在这种方式下,代码和数据都被加载到RAM中,从RAM中运行。加载过程如图3所示。

    (1)完成CPU复位,执行启动向量所在的第一条指令(位于Boot ROM内),这条跳转指令跳转到Boot ROM内的硬件初始化代码位置,执行必需的硬件初始化工作。

    (2)硬件初始化代码完成CPU的初始化,比如设置CPU的段寄存器、堆栈指针等,以及其它硬件的初始化。

    (3)位于Boot ROM 中的代码,将位于Flash中的操作系统和应用程序的TEXT节,从 Flash中搬移到RAM中。这个过程需要Boot ROM内的搬移代码预先了解TEXT节的起始地址和大小,可通过在操作系统映像的开始处设置一个数据结构,来指明这些节的大小,以及起始位置和目标位置等。这样在搬移时,Boot ROM中的代码就可以先从这个固定位置获得节的信息,然后根据这些信息完成搬移工作。

    (4)与第三步类似,Boot ROM中的代码将操作系统和应用程序映像的DATA节搬移到RAM中。

    (5)Boot ROM中的启动代码完成BSS节的RAM空间预留。

    (6)完成上述所有任务后,Boot ROM中的代码通过一条跳转指令跳到RAM中操作系统的入口点,正式启动操作系统。

    2.3从文件系统加载运行

    上述两种启动方式中,操作系统和应用程序的二进制映像存放在Flash中,而Flash直接映射到CPU的可寻址空间。因此,加载时直接通过访存指令即可完成,无需额外的设备驱动程序。但这种方式需要操作系统配置较多的Flash存储器,在操作系统映像很大的情况下,矛盾突出。而从文件系统中加载运行的方式可以很好地解决该问题。

    这种从文件系统加载操作系统映像的方式与从Flash加载方式不同的是,操作系统和应用程序映像是放在外部存储器中,例如硬盘。而对于外部存储器访问所需要的驱动程序,则存放在Boot ROM中。存放方式如图4所示。

    (1)完成CPU复位,执行启动向量所在的第一条指令(位于Boot ROM内),跳转到Boot ROM内的硬件初始化代码位置,执行必需的硬件初始化工作。

    (2)硬件初始化代码完成CPU初始化,比如设置CPU的段寄存器、堆栈指针等,以及其它硬件的初始化。

    (3)Boot ROM中的引导代码通过外部设备的驱动程序读取外部存储器,将操作系统和应用程序的映像加载到RAM中。这个过程中,可以不区分TEXT节和DATA节,而作为统一的二进制映像进行加载。

    (4)完成二进制加载后, Boot ROM中的启动代码需要进一步为操作系统预留BSS空间。

    (5)完成上述动作,操作系统运行的环境就绪后,Boot ROM中的代码通过一条跳转指令,跳转到操作系统入口点,这样后续系统运行就完全在操作系统的控制下进行。

    3三种加载方式性能分析

    第一种加载方式:所有的执行指令都是从Flash中读取,RAM中只存放数据和堆栈。这种启动方式可以节约物理内存空间,因此不需要专门为代码预留内存空间,一般应用在内存数量受限的系统中。这种加载方式,有以下缺点:

    (1)由于代码直接在Flash中执行,一般情况下对Flash的访问速度会比对RAM的访问慢,因此性能会受到影响。若CPU本身携带了较大数量的代码缓存,这个问题则会得到一定程度的缓解。

    (2)代码直接从Flash中执行,而Flash的只读功能无法实现代码的自我修复,不利于代码级的调试。

    (3)在对操作系统核心和应用程序代码进行编译时,必需指定TEXT节、DATA节和BSS节的起始地址,这个地址与它们在Flash和RAM中的最终位置相同。因此,增加了开发难度。

    第二种加载方式:是一种比较常见的启动方式,简便易行,而且克服了直接从Flash中运行代码的一些弊端。但是操作系统和应用程序的代码直接在RAM中执行,因此这种方式需要嵌入式系统配置较多的RAM存储器。

    第三种加载方式:将操作系统和应用程序的映像都搬到了外部存储器介质上,不但可以节约Flash存储器,而且可以适应大容量的操作系统映像。由于引入了外部存储介质,嵌入式系统运行过程中产生的一些状态数据,比如报警、日志等可以存储在大容量的外部存储介质上,方便问题的定位。此外,也可以在线升级(系统在运行过程中,对操作系统和应用程序软件进行升级)。但这种方式实现起来相对复杂,需要额外的存储介质访问接口电路,而且需要软件实现针对这些外部存储介质的驱动程序,大大延长开发周期。这种模型一般应用在一些大型嵌入式系统设计上,比如,位于网络核心位置的核心路由器(GSR或TSR),就是用这种方式进行设计的[34]。

    参考文献参考文献:

    [1]张起贵,裴科,张刚,赵哲峰. 基于不同类型FlashROM的Bootloader设计[J]. 计算机工程与应用,2007(33):112114+166.

    [2]李毅,李连云,张伟宏,张晓先,郑果,李健. Bootloader面向不同结构Flash的实现[J]. 计算机工程,2008(4):8283+86.

    [3]夏玮玮,沈连丰,肖婕,毛宇斌. 嵌入式系统关键技术分析与开发应用[J]. 单片机与嵌入式系统应用,2003(2):59.

    [4]赵磊.QNX实时操作系统及其应用分析[J]. 软件导刊,2009,8(5):2224.

    责任编辑(责任编辑:陈福时)

    相关热词搜索: 嵌入式 实时 加载 操作系统 方式

    • 生活居家
    • 情感人生
    • 社会财经
    • 文化
    • 职场
    • 教育
    • 电脑上网