摘 要 随着Linux操作系统本身的不断完善,嵌入式Linux已经广泛应用到手机、PDA以及其他移动终端产品中。嵌入式Linux以其开放的源码,良好的适应性,较低的成本和很好的技术移植在手机等移动终端产品的操作系统领域,获得了越来越多的青睐。本文通过对嵌入式Linux在移动终端产品中的优势分析,尤其对实时性的分析比较,介绍了其在手持移动终端产品方面广阔的应用前景和实际应用情况。 关键词 Linux 嵌入式Linux 实时性 嵌入式 Monta Vista 1 前 言 1. 1 Linux操作系统的引入 早在2001年,手机生产商们便开始寻求一种基于“开放”的操作系统的手机,所谓“开放”指其所有的API(应用程序接口)应该是公开并且受到广泛支持。当时所面临的选择有Symbian的EPOC平台,Palm/OS以及微软的WIN CE。随着研究的深入,Linux的嵌入式版本开始受到青睐并扩展其市场。从2001年至2002年,嵌入式Linux在嵌入式操作系统的市场份额迅速增长了一倍左右,从而成为嵌入式OS中的重要一员。 1. 2 Linux操作系统在移动设备领域的优势 首先,Linux属于开放的操作系统,它自身的技术文档甚至源代码都是开放的,因而在学术领域受到格外青睐,使得它对新技术,新协议有良好的适应性. 其次,由于Linux和Unix之间的相似性,使得许多对Unix熟悉的开发人员能够很快在相似的基于嵌入式Linux开发环境中进行开发工作。另外, 由于Linux源码的开放性使得代码移植和重用变得相当普遍,基于嵌入式Linux平台的开发产品往往只花费较低的成本就能有很好的质量。这对于注重开发成本的公司无疑具有极大的诱惑力。 此外,Linux提供了良好的安全性能和并行处理能力。Java语言在移动领域正逐渐成为主流的开发语言,而实验表明,在相同的硬件平台上,Java虚拟机在Linux上能取得比Windows CE上更好的性能值。因此Java+Linux成为现在的时尚搭配。当然,Linux在价格上的优势也很关键。尽管Linux并非全免费,但和其他商用操作系统相比,它还是占尽价格优势。 1. 3 Linux操作系统占用空间情况 在占用空间方面,Linux大约占用1M ROM和2M RAM。这和Windows CE的空间占用几乎差不多,而Linux的优势在于通过压缩文件系统能在RAM 和ROM之间作出相对合理的平衡。 2 嵌入式Linux目前的商用版本 目前国际嵌入式Linux市场的商用版本有: 其中某些商用版本已被一些手持移动设备生产公司所使用,例如Sharp公司的ZaurusPDA采用就采用了Lineo的Embedix,该Linux版本采用“Qtopia”的GUI;而新近MOTOROLA公司推出的A760采用了MontaVista公司的Linux CEE3.0。 目前国内的Linux嵌入式操作系统厂商队伍也正在逐渐扩大,已形成百家争鸣的局面,在市场上主要有红旗嵌入式Linux、博利思推出的Pocket IX、蓝点的嵌入式Linux系统、网虎科技推出的Coventive和共创软件联盟推出的CC-Linux。这些版本大都对通用的Linux进行了合理的裁剪,实现了ROM/RAM/Flash的文件系统、软实时、能量低中断、电源管理、Java虚拟机、多平台和多线程支持。 3 关于嵌入式Linux实时性问题的思考 本文将重点讨论在嵌入式Linux系统中如何实现实时性的问题: 3.1 问题的提出 众所周知,在多进程的操作系统中,进程调度是一个全局性的、关键性的问题,它决定着系统的总体设计、实现、功能设置以及各个方面的性能。而根据不同的调度算法进行的进程切换的速度,也是衡量一个操作系统性能好坏的重要指标。一个好的系统的进程调度机制,往往兼顾三种不同的需要: (1)交互式应用:着重于系统的响应速度,使共用一个系统的各个用户都能感觉到自己是在独占地使用一个系统。 (2)批处理应用:对响应速度并无要求,但是完成一个作业所需的时间仍是一个重要的因素,考虑“平均速度”。 (3)实时应用:时间性最强的应用,不但要考虑进程执行的平均速度,还要考虑“即时速度”;不但要考虑响应速度,还要考虑有关程序能否在规定时间内执行完。移动设备例如手机、PDA等,对实时性要求特别高。 标准的Linux内核继承了Unix的时间共享机制,并不太适合实时性要求。内核不是采用抢占方式而是采用基于公平原则的时间片来进行进程调度。所以其中就存在矛盾,因为如果调度的机制为:把时间分成时间片,每个时间片来一次时钟中断,而调度可以在时间片中断时进行。调度原则为根据进程的优先级别安排何进程先运行,每个时间片一次,除此之外就只能在进程资源满足时才可进行调度。这样,只要时间片分得得当,交互式应用就能满足,但是这样的机制并不适合实时的应用。因为可能在某一时刻有优先级别高的进程急着要运行,而恰有进程正在运行中,那优先级别高的进程只能干等着。当然,这也取决于CPU的速度,如果CPU有能力把时间片分小到0.5毫秒,而CPU仍然能在这么短的时间里做足够多的事,那么对一般的实时应用可以满足要求。但是,对于手机这种属于CLDC(Connected Limited Device Configuration)的设备,CPU不快,存储容量受限,该问题就凸显不便。 3.2 问题的解决方案 目前在移动设备上使用的嵌入式Linux系统中,为了满足实时性的要求,一般采用两种方法:利用处理器的能力开发的快速应用程序; 插入第二层内核,模拟CPU的中断处理,管理实时事件和处理,而让本来的Linux内核运行在一个比第二层内核较低优先级上。但是该种方法对Linux的通用性产生了影响,因为该方法产生了不同的API和非标准的编程模型,并且有可能剥夺原来的Linux的正常运行权。所以当前的所谓实时Linux操作系统并非真正意义的Linux。 那么能否从Linux本身找到解决办法呢?Linux本身的源码中就有解决方案。 Linux和Unix一样,以进程优先级为基础进行调度。内核为每个进程计算出一个反映其运行资格的权值,即我们所提到的优先级。然后挑选权值最高的进程投入运行。在运行过程中,当前进程的权值随时间而递减,从而在下一次调度的时候原来权值较低的进程可能就更有资格运行了。当所有进程的权值都变成0,就重新计算一下所有进程的权值。 Linux内核为了适合不同应用的需要,实现了三种不同的政策:SCHED_FIFO、SCHED_RR以及SCHED_OTHER。每个进程都有自己的适用的调度政策,并且进程还可以通过系统调用sched_setscheduler()设定自己适用的调度政策。其中,SCHED_FIFO就适用于时间性要求比较高但每次运行所需时间比较短的进程,即实时性要求比较高的情况。调度政策为SCHED_FIFO的进程一旦受到调度进入运行,就一直运行到自愿让出或者被优先级更高的进程剥夺为止。Linux针对实时进程,特别定义了实时优先级rt_priority,其权值为(1000 +p->rt_priority),也就是说实时进程的权值至少是1000,所以当有实时进程就绪时候非实时进程是没有机会运行的。这种机制说明Linux有能力不通过插入第二层内核就能很好地支持实时性。 这就提供了第三种潜在的解决方案来实现实时嵌入式Linux:使用Linux自身所具备的实时能力,即利用支持SMP的标准内核本身的强占性能力。这样,不仅可以使用本地的Linux代码、API和程序模型,并可以完全发挥Linux在其他方面的处理能力。而事实上,Linux 2.4和2.5版本已经提出了该解决方案。今年Linux 2.6版本推出,对实时性的有了更好地支持。这将更加推动嵌入式Linux在实时计算方面的应用。 3. 3 Linux 2.6解决方案 在Linux 2.6推出不久,LinuxWorks立刻宣布推出基于Linux 2.6版本的嵌入式Linux版本: BlueCat 5.0。LynuxWorks宣称这是第一款基于最新的Linux 2.6内核的嵌入式版本,因而对实时性有突破性的支持。而测试也证明了这一点,即新版本的内核对实时性的支持确实有大幅度提高。Linux 2.6之所以更好的支持实时计算,主要因为: (1)更有效率的调度算法: 在老版本的Linux中,一般有一个全局的队列,它能扫描并且按照优先级安排好就绪状态的进程并安排他们顺序执行。而新的Linux 2.6内核提供了两个队列。一个用于安排就绪的进程,一个用于安排超时等待的进程。这两个队列都按照优先权的高低对进程进行排列并且允许实时进程共享同一队列,从而通过减少队列中的就绪进程数来提高实时性。 (2)改良的内核:虽然Linux 2.6还称不上是完全的实时操作系统,但已经能够满足大部分情况下的实时要求。因为在老版本的内核中,强占是通过执行代码调用的,并且只能由中断请求(IRQ)、睡眠等来中断。而新的内核完全支持强占,即一个新的进程能够在接受到外部中断后立刻进入调度状态,因而当一个高优先权的事件到达后,系统能立刻中断当前进程而调用新的高优先权事件,从而大大缩短了响应时间。 (3)新的同步原语: 众所周知,程序之间有时候常需要共享一些资源,例如内存或者打印机等。为了避免竞争资源带来的混乱,我们常引入一些信号量来保证在任一时刻只有一个程序在使用某种独占性资源。在以往的Linux中,是通过向内核提交一个系统调用来决定是否让一个线程继续执行。但是这样就引入了一个问题,即如果通过系统调用后内核还是决定继续让该线程运行,那么系统调用那部分时间就完全浪费了。而Linux 2.6支持基于用户空间的快速信号量。该功能能够在用户空间检查中断是否必需,只有当确有需要的时候才调用系统中断线程。如果发现实际上并不需要中断则不实行系统调用,从而节省了不必要的系统调用。当发生资源争用的时候,该功能同样使用调度优先权来决定哪个线程应该执行。 Linux 2.6除了在实时性方面的良好支持,它对大容量模块,输入输出系统以及代码移
[1] [2] 下一页
(出处:http://www.sheup.com)
上一页 [1] [2]