本文原作者写于5年前,期间可能有些技术的小变化,但作为对嵌入式Linux和QNX的入门了解还是不错的。
介绍
上个世纪90年代末期,Web设备被贬低为下一个划时代的“大风波”,一种新型设备会形成一个新兴市场因而会形成下一代消费IT大鳄。在拉斯维加斯的消费电子展上和QNX2000国际技术大会上,大大小小的生产商展示了许多对未来的设想。
英特尔基于Linux建立了Web设备,谷歌的合作方基于一个阉割版的WindowsCE开发Web设备。其他公司,例如3Com和NetplianceiOpener则是基于QNX。当时Web设备看上去很大可能是消费电子的未来。相比个人笔记本,她们提供更少的功能。那种时侯,KenKalinoski(Netpliance的发展总工裁)能想到的最好的方法是一个富顾客端联接到一个专门的服务器上。百思买和家乐福货架上前面Web设备的降低说明消费者并不买账。她们不想要一个设备只能浏览网页和处理简单的电邮,而且不能处理文本或储存数据。而且,消费者也不喜欢被指定的服务供应商绑定。
Linux和QNX由于作为Web设备上的操作系统和巨大的平台开发能力声名鹊起。Linux过去作为服务器操作系统使用最多,而QNX主要用于工业级的嵌入式实时操作系统。为了挖掘新的市场,许多开发者开始开发Linux和QNX在更小,更便携式设备上的能力。
事后看来,Web设备是一个技术超前的看法。虽然有软件和工程天才们生产这种设备,而且硬件和基础设施的局限性不能让Web设备满足一个电子必需品的功能,例如多功能性和便携性。联通电话和PDA技术的提升,数码摄像机的进步,更低电量的需求,显存的下降,嵌入式或联通CPU速率的巨大提高,以及802.11b和802.11gWIFI无线网路合同,这种所有的诱因使得Web设备成为一个多功能设备。这个设备集合了笔记本,办公软件,手机嵌入式linux驱动,摄像机(包括影片),寻呼机,音乐播放器,其实也包括Web浏览和短信系统。这种所有的功能集成在一个可以放进口袋的无线设备上。
四年以后,我们处在一个新的“下一个大风波”的边沿。在早已具有庞大的PDA和Internet功能的手机市场上,硬件以及就地无线和服务基础设施的进步,对能否提供更多功能,更紧凑且电瓶寿命更长的设备形成了巨大的需求。这个重新迸发了人们对嵌入式开发平台的兴趣,保证将来能在数十亿港元的市场中竞争。
设计相像之处就在这儿结束。LinusTorvalds使用宏内核构架设计了Linux作为一个通用的操作系统运行在个人笔记本上。内核几乎包含了操作系统须要的所有功能。相反,QNX的设计则愈发模块化和可扩充。QNX是一个基于微内核的实时操作系统,能足够小的嵌入到芯片提供运行工作站或小型网路服务器的能力。
Linux的嵌入式发展
因为Linux自身的强壮性,相对紧凑,通用,低成本和开源的license模式这种优点,嵌入式系统的设计者很长时间都在使用Linux。Linux可以让设计软件充分借助大量的开发人员,永远丰富的代码遗产和行业标准的便携式操作系统插口(POSIX)API。
标准的Linux内核没有嵌入式系统要求的实时能力(可预测的应答时间和微秒级的延后一般被觉得是确定的风波)诸如电传操纵,ABS刹车系统,连续介质和医疗设备。并且,Linux可以直接用于不受确定性问题影响的消费类设备中。为了满足当前正在开发的嵌入式设备的需求,出现了几种Linux产品,可以满足愈发可预测的速率和定时行为。
嵌入式系统中使用Linux
虽然一开始Linux设计是为了个人笔记本使用,并且Linux也可以成为一个可靠的嵌入式操作系统。一个具有所有功能的Linux内核的缩小的Linux包,仅占用约1M的显存。纯的Linux内核(虚拟显存和所有核心操作系统功能)仅占用大概100K。加上网络栈和基本的使用,一个完整的Linux运行时大概占用500K显存。所须要的总的显存由运行的应用程序来运行,并且Linux系统仅须要256KROM和512KRAM就可以工作。这对嵌入式市场来说是一个轻量级的操作系统。
使用开源的Linux系统另一个用处是,相比较传统的实时操作系统,Linux开发社区会更快的支持新的合同以及比实时操作系统供应商支持更多的设备驱动。
Linux操作系统的核心是一个相对简单的微内核构架。网路和文件系统以模块化的形式坐落宏内核之上。驱动和其他功能可以编译进内核linux操作系统版本,也可以在运行时加载。这提供了一种高度模块化的建立块方式来建立订制的嵌入式系统,该方式一般使用订制驱动程序和应用程序的组合来提供附加功能。
为了防止重新发明轮子,嵌入式系统一般须要使用现成的程序和驱动程序建立通用功能。许多程序和驱动程序用于外围设备和应用程序。Linux可运行在大多数须要有大量外设的微处理器上,而且有大量的现场的应用。
Linux才能挺好的适配嵌入式网路设备,由于它支持多处理器系统,拥有扩充性。这让设计者多了一个选项,可以在双处理器系统上运行一个实时的应用程序,因而提升总的处理能力。所以你可以在一个处理器上运行Linux,而同时在另一个处理器上运行GUI。
在嵌入式系统上运行Linux的一个缺陷是,Linux构架不能以一个标准的方式提供实时能力。例如标准的Linux是按照公正算法来进行任务调度,也就是给每位任务相同的处理器时间。解决方案是通过额外的实时变化更改Linux让它以确定的形式运行。
图1:拥有双标准和实时操作系统内核的Linux
嵌入式Linux的标准化
Linux有超过200多个的发行版本和好多嵌入式版本。因为嵌入式Linux要没有存在的标准,一个统一的平台规范让Linux的使用具有一个更经济,专注的环境,Linux几乎就是无用的。
为了保证嵌入式Linux版本的兼容性,嵌入式Linux联盟(ELC)创立了。ELC是一个非赢利性行业商会,旨在于在整个嵌入式估算市场中改进,促使和标准化Linux。成员们为了享受标准化带来的益处,要参与管理、促进,实现和平台规范工作组。
ELC的使命是:“…..让Linux成为嵌入式系统开发者的首选“。InderSingh博士,ELC的主席和Lynuxworks的CEO评价说:“Linux早已开算成长为消费类电子产品的操作系统的主要选择之一,越来越多的嵌入式软件使用Linux”。
KarenChupka,消费电子商会活动和大会总工裁表明,“操作系统软件是消费类电子产品快速下降列表中一个关键的考虑点,Linux有望在2004年下降……”
现今超过75家公司加入了由索尼和三洋创立的消费电子Linux峰会,来推动基于Linux的数字消费电子产品。2003年6月,一些其他的消费电子产品公司也加入了该峰会。那些公司是EC,Hitachi,RoyalPhilips,Samsung,SharpandToshiba.
三个嵌入式Linux版本
三洋消费电子版本3.0
三洋为它的消费电子设备引入了嵌入式Linux。三洋“消费电子版本3.0”(CEE)是嵌入式操作系统。它的目标是手机,数字电视,机顶盒和车辆远程信息处理的应用程序。CEE设计用于高度受限的联通设备,这种设备的特性是低帧率,显存大小受限以及启动和恢复时间端。据称它是第一个专门为消费电子市场设计的商业嵌入式Linux发行版。
CEE支持动态电量管理功能,文件系统强化和检测性能,系统时间,显存大小的工具,文件支持流媒体优化。
CEE的功能包括:
LynxOS
嵌入式软件公司LynuxWorks建立了两个嵌入式Linux版本。如图2所示,LynxOS是一个硬实时嵌入式系统。LynxOS是一个Linux实时操作系统,前融LinusABI和POSIX。因为是微内核设计,内核占用特别小,仅有28KB大小。
图2
中型内核提供包括调度,终端分配和同步等必要的服务。其他服务由内核轻量级服务模块提供。这种模块被称为内核插件(KernelPlug-Ins,KPIs)。新的KPIs可以被加到内核中拿来支持I/O,文件系统,TCP/IP,流和Socket。KPIs是多线程的,意味着每位KPI可以按照要求创建多个线程。
向KPI发送消息时没有上下文切换。例如当给文件系统KPI发送服务恳求消息(RFS)时,不须要上下文切换因而降低运行时的开支。KPI之间的通讯只借助极少的指令,因此开支很低。
应用程序通过系统调用向I/O系统发出I/O恳求。内核将I/O恳求定向到设备驱动程序。每位设备驱动程序都有一个中断处理程序和内核线程。中断处理程序执行中断处理的第一步。倘若未完成处理,则会设置为内核异步圈套。稍后,当内核可以响应软件中断时,它会调度内核线程的实例完成中断处理。
蓝猫
蓝猫是LynuxWorks公司建立的第一个Linux版本。蓝猫不是一个实时操作系统,并且与LynxOS二补码兼容,因而嵌入式应用程序可以轻松地移植到RTOS。蓝猫主要是为了对实时性没要求的嵌入式系统。
QNX
QNX是一个基于POSIX为嵌入式系统非常设计的实时操作系统。它除了才能让Linux开发者保持她们的编程习惯,并且还保留了Linux开源模型的关键特点。带来的益处是,这些方法才能让嵌入式开发者无论是在标准的Linux还是实时的扩充Linux都可以享受OS的服务。图3说明了QNX的构架。
图3:QNX构架
QNX是QNXSoftwareSystemsLtd.(*),Kanata,Ont.公司的商用产品。和Linux一样,QNX也是基于1970由贝尔实验室开发的UNIX。QNX和Linux都遵守LINUXPOSIX标准。
QNXNeutrino微内核为实时和非实时的应用提供了一个统一的环境。QNX基于实时,微内核的构架(见图3)提供POSIX兼容的API。Neutrino微内核只包含最基础的操作系统服务。所有其他的服务都可以通过可选的,显存保护的进程来提供,可以动态的启动和停止。为了实现模块化,QNXNeutrino使用消息传递作为整个系统IPC最基本的形式。
和Linux不同,QNX没有把POSIX作为附加层来实现。QNX微内核从一开始设计时就支持POSIX实时性,包括线程。ELC规范是基于现存的POSIX1003.1标准。这个标准QNX也支持。为此嵌入式linux驱动,QNX才能天然支持嵌入式Linux应用。
QNX,和Linux一样,提供开源模式的用处。通过代码,开发者才能剖析操作系统的构架便于更好地集成她们的代码,适配操作系统组件来满足应用特定的需求,并节约问题定位的思索时间。QNX通过两种方法来提供里面的用处。
作为微内核操作系统,QNXNeutrino从根本上对订制开发。这是由于大部份操作系统层面的服务驱动,文件系统和合同栈存在于内核外的用户空间,只有少量的核心服务(例如调度,定时器,中断处理)存在内核中。为此,开发自定义驱动程序和应用程序特定的OS扩充不须要特殊的内核调试器或内核专家。事实上,作为用户空间的程序,开发OS扩充和开发标准的应用程序一样简单,由于它们可以用你们相熟的标准的源码级别的工具调试。
QNXNeutrino容许应用程序通过称之为同步消息传递这些统一的IPC方法来访问所有的驱动程序和操作系统服务。这些方法有几个益处。例如,因为QNX的消息传递是同步的,因而才能手动协调通讯程序的执行,因而无需在每位进程中自动编码和调试复杂的同步服务(见图3)。消息传递本质上简化了复杂操作系统,将其界定为明晰定义的可以单独开发,测试和维护的基础建立模块。通过任何提供服务的程序在路径名空间注册路径名将其广而告之给其他程序来实现。任何程序都还能通过在路径名上调用诸如open(),read(),write(),或则lseek()来访问其他服务。
举个反例。QNX并口驱动一般注册路径名/dev/ser1表示第一个并口。任何想访问这个端口的应用程序可以通过调用在/dev/se1上的open()函数来实现。对于应用程序而言,open()函数和标准的POSIX插口一样。
NeutrinoC函数库将这个调用转成io_open消息并把这个消息转发给并口驱动。倘若应用程序接出来要想并口写一个字符,调用序列如下:顾客端调用write()函数,C函数库会建立一个io_write消息。这个消息会被转发给驱动。
这样带来的另一个用处是只要该服务支持某特定的功能,准确的消息就可以从任何顾客端发送给任何服务。例如,向一个并口或c盘文件写一个字符串,应用程序在这两种情况可以调用相同的write()函数,惟一的区别是消息要发送的地方。这意味着应用程序和它依赖的服务是前馈的。这些前馈可以使开发简单化,由于应用程序和系统服务之间所有的交互可以用一个简单的基于POSIX的编程模型来实现。
这样简化了代码移植到其他平台由于应用程序不包含任何硬件或合同特定的代码。
通过给顾客提供诸如库,驱动和BSP的源码,QNXNeutrino进一步简化了问题定位和OS的多样化开发。开发者可以免费下载设备驱动包(DeviceDriveKits,DDKs)。DDKs包含文档和一个软件框架。这个软件框架实现了库中更高级别的独立设备的代码。
在囊括大多数Linux源代码的GPL中未提供QNX源代码。但是,QNX软件系统基于它们自己的License合同提供源码。不像GPL,可以让开发人员自由创作衍生作品,而毋须舍弃知识产权(IP)。
作为宏操作系统,Linux将大部份的驱动,文件系统和合同中都绑进了内核中。因而这种模块中任何一个单一的编程错误就有可能造成致命的内核错误。在QNXNeutrino中,这种模块都运行在独立的、内存保护的地址空间中,内核崩溃很难发生。因而QNXNeutrino为实时应用程序提供了一个比Linux更强壮的环境。而且也肯定比双内核方式中使用的不受保护的实时内核强得多。
QNX附加值:
推论
在QNX中,实时和非实时环境是一样的。实时应用程序可以充分使用POSIXAPI和访问系统服务。POSIX/Linux应用程序可以立即获得确定的行为。因为实时和非实时应用程序运行在相同的基于消息的环境中linux社区,进程之间的通讯就十分简单了。降低重复工作。像之前讨论的,双内核方法会迫使开发者使用不熟悉的API开发订制驱动。在大部份的操作系统环境中,开发这种驱动要求内核调试工具(特别难用),内核重新编译(特别历时)和内核编程(成本高)。QNXNeutrino通过几种方法解决了这个问题。首先,像任何已具有大量用户群的OS一样,QNX支持各类用于标准硬件的现成驱动程序。而且,如同我们看见的,QNX在用户空间运行驱动,因而可以使用标准的代码级别的工具和技术。QNXDDKs让开发显得更简单了。DDK提供文档,库文件,头文件和可订制的各类驱动程序源。不仅微内核的功能,因为微内核实时操作系统的设计是为了满足嵌入式系统的要求,QNXNeutrino还为Linux开发人员提供标准Linux或实时Linux扩充均不具备的功能。
与QNX相比,Linux有更大的开发人员社区,软件社区和真正的开源代码,以及更大的平台社区。ELC和CELF正在使嵌入式Linux标准化。嵌入式Linux的最新版本要求具有完全POSIX兼容性的硬RTOS。