当前位置:Linux教程 - Linux - Linux嵌入式系统与硬件平台的关系

Linux嵌入式系统与硬件平台的关系



         作者:linuxbug 来自:网虎科技

    摘要 完整的电器设备一般要包括软件和硬件两大部分,本文试图从Linux软件系统、硬件平台以及开发流程来探讨Linux嵌入式系统与硬件平台的关系。


    关键词 Embedded Linux OS 嵌入式Linux操作系统,

    Micro processor 微处理器

    一、 Linux嵌入式系统----

    操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口。它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合适的操作环境。嵌入式系统由于硬件的先天限制,经常只具有极稀少的硬件资源,如 时脉较少的 CPU、较少的内存、常不具有磁盘而用小容量的DiskOnChip或DiskOnModule。而在使用电池的系统中,它还要实现节省电池消耗,延长电池使用时间的功能。

    Linux 作为嵌入式操作系统是完全可行的,因为Linux提供了完成嵌入功能的基本的内核和你所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。将Linux看作是连续的统一体,从一个具有内存管理、任务切换和时间服务及其他的分拆的微内核到完整的服务器,支持所有的文件系统和网络服务。Linux作为嵌入式系统是一个带有很多优势的新成员,它对许多CPU和硬件平台都是易移植的、稳定、功能强大、易于开发。

    Application program

      API  

    X-server Java virtual machine

      Device driver  

      Linux Kernel  

      Boot load  

    嵌入式Linux系统需要下面三个基本元素:

    1. 引导工具

    2. Linux微内核:内存管理、 程序管理

    3. 初始化进程

    如果要它成为完整的操作系统且继续保持小型化,还得加上:

    1.硬件驱动程序

    2.硬件接口程序

    3.应用程序组

    谈到操作系统就一定要说一说它的开发环境,Linux是基于GNU的C编译器,作为GNU工具链的一部分,与gdb源调试器一起工作。它提供了开发嵌入式Linux系统的所有软件工具。以下是一个典型的开发工具的使用流程:

    1.写入或植入引导码

    2.向串口打印字符串的编码

    3.将gdb目标码移植工作串口,这可与另一台运行gdb程序的Linux主机系统对话

    4.利用gdb让硬件和软件初始化码在Linux内核启动时工作

    5.Linux内核启动,串口成为Linux控制口并可用于后续开发

    6.如果在你的目标硬件上运行了完整的Linux内核,你可以调试你的应用进程

    更详细的内容可参见网站http://www.emlinux.com


    二、硬件平台

    研发人员在选择最好的硬件时,往往由于缺乏完整或精确的信息而使选择硬件成为复杂且困难的工作。硬件成本经常是关键的议题,当考虑成本时、需要确信你在考虑产品的整个成本而不仅是CPU的成本;因为好的CPU一旦加上总线逻辑和延时电路使之与外设一起工作,硬件系统可能变成非常昂贵的产品。如果你正在寻找嵌入式软件系统,那么应首先确定了硬件平台即确定了微处理器CPU的型号。

    现在比较流行的硬件平台有Intel公司的Strong Arm 系列,Motorola公司的DragonBall系列,NEC公司的VR系列,Hitachi公司SH3,SH4系列等等,都可选为硬件平台。但最好在选定前先要确定所做系统的应用功能和所需的速度,并且制定好外接设备和接口标准。这样可准确的定位所需要的硬件方案,得到性价比最高的系统。 下图是以Intel公司的StrongArm为例来说明硬件平台:

    三、Linux嵌入式系统与硬件的关系

    对初学者而言,可以将内核与任务分开,标准的Linux内核通常驻留在内存中,每一个应用程序程序都是从磁盘运到内存上执行。当程序结束后,它所占用的内存就被释放,程序就被下载了。在一个嵌入式系统里,可能没有磁盘。有两种途径可以消除对磁盘的依赖,这要看系统的复杂性和硬件的设计。在一个简单的系统里,当系统启动后,内核和所有的应用程序都在内存里。这就是大多数传统的嵌入式系统工作模式,它同样可以被Linux支持。有了Linux,就有了第二种可能性。因为Linux已经有能力"加载"和"卸载"程序,一个嵌入式系统就可以利用它来节省内存。试想一个典型的包括一个大概8MB到16MB的Flash Memory和8MB内存的系统。Flash Memory可以作为一个文件系统。Flash Memory驱动程序用来连接Flash Memory和文件系统。作为替代也可使用Flash Disk,用工具软件可把Flash Memory仿真为磁盘或部分。其中一个例子是Intel 公司可提供Flash Memory 管理软件IPSM -Intel Persistent Storage Manager, 详情见 http://developer.intel.com/design/builder/flbldr/swb/swb.htm

    所有的程序都以文件形式存储在Flash文件中,需要时可以装入内存。这种动态的、"根据需要加载"的能力是支持其它一系列功能的重要特征:

    1. 它使初始化代码在系统引导后被释放。Linux同样有很多内核外运行的公用程序。这些通常程序在初始化时运行一次,以后就不再运行。而且,这些公用程序可以用它们相互共有的方式,一个接一个按顺序运行。这样,相同内存空间可以被反复使用以"调入"每一个程序,就象系统引导一样。这的确可以节省内存,特别是那些配置一次以后就不再更改的网络堆栈。如果Linux可加载模块的功能包括在内核里,驱动程序和应用程序就都可以被加载。它可以检查硬件环境并且为硬件装上相应的软件。这就消除了用一个程序占用许多Flash Memory来处理多种硬件的复杂性。

    2. 软件的升级更模块化。你可以在系统运行的时候在Flash上升级应用程序和可加载驱动程序。

    3. 配置信息和运行时间参数可以作为数据文件储存在Flash上。


    虚拟内存

    标准Linux的另一个特征是虚拟内存的能力。正是这种神奇的特征使应用程序员可以狂热的编写代码而不计后果,不管程序有多大。在嵌入式系统里不需要这种强大的功能。实际上,因为它会带来无法控制的时间因素,你可能不希望它在实时的系统里。这个软件必须设计得更加精悍,以适合硬件平台上的物理内存,就象其它嵌入式系统一样。注意由于CPU的原因,通常在Linux中保存虚拟内存代码是明智的,因为将它清除很费事;而且还有另外一个原因--它支持共享文本,这样就可以使许多程序共享一个软件。

    虚拟内存的调入功能可以被关掉,只要将交换空间的大小设置为零。如果你写的程序比实际的内存大,系统就会当作你的运行用尽了交换空间来处理;这个程序将不会运行,或者malloc将会失灵。在许多CPU上,虚拟内存提供的内存管理可以将不同程序分开,防止它们写到其它地址的空间上。这在嵌入式系统上通常不可能,因为它只支持一个简单、扁平的地址空间。Linux的这种功能有助于其发展。它减少了胡乱的编写程序造成系统崩溃的可能性。许多嵌入式系统基于效率方面的原因有意识使用程序间可以共享的"全局"数据。这也可以通过Linux共享内存功能来支持,共享的只是指定的内存部分。


    文件系统

    许多嵌入式系统没有磁盘或者文件系统。Linux不需要它们也能运行。实际上,许多商业性嵌入式系统提供文件系统作为选项。Linux提供MS-DOS-Compatible文件系统,同时还有其它多种选择。之所以提供其它选择是因为它们更加强大而且具有容错功能。Linux还具有检查和维护的功能,商业性供应商往往不提供这些。这对于Flash系统来说尤其重要,因为它是通过网络更新的。如果系统在升级过程中失去了能力,那它就没有用了。维护的功能通常可以解决这类问题。

    文件系统可以被放在传统的磁盘驱动器、Flash Memory或其它这类的介质上。而且,用于暂时保存文件,一个小RAM盘就足够了。Flash Memories被分割成块。这些块中也许包括一个含有当CPU启动时运行的最初的软件的引导块。这可能包括Linux 引导代码。剩余的Flash可以用作文件系统。Linux的内核可以通过引导代码从Flash复制到RAM,或者还有一个选择,内核可以被存储在Flash的一个独立部分,并且直接从那里执行。另外对于一些系统来说还有一个有趣的选择,那就是将一个便宜的CD-ROM包含在内。这比Flash Memory 便宜,而且通过交换CD-ROM支持简单的升级。有了这个,Linux 只要从 CD-ROM上引导,类似从硬盘上一样从CD-ROM上获得所有的程序。

    最后,对于联网的嵌入式系统来说,Linux 支持NFS(Network File system)。这为实现联网系统的许多增值功能打开了大门。第一,它允许通过网络上加载应用程序。这是控制软件修改的基础,因为每一个嵌入式系统的软件都可以在一个普通的服务器上加载。它在运行的时候也可以用来输入或输出大量的数据、配置和状态信息。这对用户监督和控制来说是一个非常强大的功能。举例来说,嵌入式系统可以建立一个小的RAM磁盘,包含的文件中有与当前状态信息同步的内容。其它系统可以简单的把这个RAM磁盘设置为基于网络的远程磁盘,并且空中存取状态文件。这就允许另一个机器上的Web服务器通过简单的CGI Script存取状态信息。在其它电脑上运行的其它应用程序包可以很容易的存取数据。


    引导--LILO和BIOS在哪里

    当一个微处理器第一次启动的时候,它开始在预先设置的地址上执行指令。通常在那里有一些只读内存,包括初始化或引导代码。类似于在PC上的BIOS。它执行了一些低水平的CPU初始化和其它硬件的配置文件。BIOS继续辨认哪个磁盘里有操作系统,把操作系统复制到RAM并且转向它。实际上,这非常复杂,但对我们的目标来说也非常重要。在PC上运行的Linux依靠PC的BIOS来提供这些配置和OS加载功能。

    在一个嵌入式系统里经常没有这种BIOS。这样你就要提供同等的启动代码。幸运的是,嵌入式系统并不需要象PC机上的 BIOS引导程序那样的灵活性,因为它通常只需要处理一个硬件的配置。这个代码更简单也更枯燥。它只是个指令清单,将固定的数字塞到硬件寄存器中去。然而,这是关键的代码,因为这些数值要与你的硬件相符而且要按照特定的顺序进行。所以在大多数情况下,一个最小的通电自检模块,可以检查内存的正常运行、让LED闪烁,并且驱动其它必须的硬件以使主Linux OS启动和运行。这些启动代码完全根据硬件决定,不可随意移动。幸运的是,许多系统都有为核心微处理器和内存所定制的菜单式硬件设计。典型的是,芯片制造商有一个样本主板,可以用来作为设计的参考--或多或少与新设计相同。通常这些菜单式设计的启动代码是可以获得的,它可以根据你的需要轻易的修改。在少数情况下,启动代码需要重新编写.为了测试这些代码,你可以使用一个包含模拟内存的电路内置模拟器,它可以代替目标内存。你把代码装到模拟器上并通过模拟器调试。如果这样不行,你可以跳过这一步,但这样就要一个更长的调试周期。这个代码最终要在较为稳定的内存上运行,通常是Flash或EPROM芯片。你需要使用一些方法将代码放在芯片上。怎么做,要根据"目标"硬件和工具来定。

    一种流行的方法是把Flash或EPROM芯片插入EPROM或Flash烧制器。这将把你的程序"烧"(存)入芯片。然后,把芯片插入你的目标板的插座,打开电源。这个方法需要板上配有插座,但有些设备是不能配插座的。

    另一个方法是通过一个JTAG界面。一些芯片有JTAG界面可以用来对芯片进行编程。这是最方便的方法。芯片可以永远被焊在主板上,一个小电缆从板上的JTAG连接器,通常是一个PC卡,联到JTAG界面。下面是PC运行JTAG界面所需的一些惯用程序。这个设备还可以用来小量生产。


    稳定性

    对大多数微处理器来说,Linux非常好。移植到新微处理器家族的Linux内核运行起来与原来的微处理器一样稳定。它经常被移植到一个或多个特定的主板上。这些板包括特定的外围设备和CPU。幸运的是,许多代码是与处理器的特性不相关的,所以移植集中在处理器的差异上,其中大多数是在内存管理和中断控制领域。一旦成功移植,它们就非常稳定。

    引导策略广泛依赖于硬件要求,而且你必须有计划地做一些定制的工作。设备驱动程序更加混乱:有些稳定有些不稳定。而且选择很有限;一旦你离开了通用的PC平台,你需要自己编写。幸运的是,周围有许多驱动程序,你可能可以找到一个与你的需求相近的修改一下。这种驱动程序界面已定义好。许多类似的驱动程序都非常相近,所以把磁盘、网络或一系列的端口驱动程序从一个设备移植到另一个设备上通常并不难。你可能发现许多驱动程序都写得很好,很容易理解,但你还是要准备一本关于内核结构的书在手头。

    总之,这些操作系统和Linux的问题在于对工作过程微小之处的误解,而不在于代码的难度或基本的设计错误。任何操作系统都有很多争论不休的故事,这里不需要重复。Linux的优势在于源代码是公开、注释清晰和文档齐全的。这样,你就可以控制和处理所出现的任何问题。

    三、嵌入式Linux操作系统将如何发展

    嵌入式Linux的确有它的缺陷。比如,虽然它并不比某些竞争对手差多少,但它的确是个需要占用存储器的操作系统。这可以通过减少一些不必要的功能来弥补,但这可能会花很长的时间,而且如果不仔细的话,还可能带来很大的困扰。许多Linux的应用程序都要用到虚拟内存,在许多嵌入式系统中,是没有价值的,所以不要以为一个没有磁盘的Linux嵌入式系统可以运行任何Linux应用程序。

    综上所述,Linux嵌入式操作系统在嵌入式系统中的应用才刚刚开始,但它所具有的技术优势和独特的运开发模式给业界以新异,有理由相信在不久的将来Linux嵌入式操作系统一定会成为绽放在操作系统中美丽的奇葩。

    发布人:Crystal 来自:网虎科技