当前位置:文档之家› 基于Linux嵌入式操作系统的研究

基于Linux嵌入式操作系统的研究

基于Linux 嵌入式操作系统的研究李红卫1,潘瑜1,王树亮2,薛小锋1(1.江苏技术师范学院计算机科学与工程学院,江苏常州213001;2.江苏技术师范学院图书馆,江苏常州213001)摘要:从Linux内核实时性、实时调度策略以及时钟细粒度定时器三个方面,对Linux嵌入式实时化技术进行了探讨。

在内核中插入抢占点或采用双内核系统,改善Linux的实时性能;通过动态优先级提高实时任务的调度性能;通过增加时钟中断频率或采用实时时钟一次性模式,实现时钟细粒度。

关键词:Linux;嵌入式系统;实时性;进程调度中图分类号:TP316.2文献标识码:A0引言嵌入式系统是集软硬件于一体可独立工作的计算机系统,它通常是更大系统中一个完整的部分[1]。

在早期的嵌入式系统设计中一般不包含操作系统,但当系统越来越复杂、应用范围越来越广泛时,没有操作系统已成为系统开发的最大障碍;因此,在嵌入式系统的发展中,出现了各种各样的商用嵌入式操作系统。

嵌入式操作系统的出现改变了以往嵌入式软件设计只能针对具体的应用从头做起,使嵌入式系统的开发方法更具科学性;同时,采用嵌入式操作系统提高了系统的开发效率,减少了开发的工作量,增强了软件的可移植性。

操作系统成为嵌入式系统的核心,是一个时代的特征,也是嵌入式系统从简单的单片机、微处理器走向愈来愈复杂的嵌入式SOC和CPU的自然体现[2]。

开源Linux操作系统的出现,给嵌入式操作系统的发展带来生机,将Linux应用于嵌入式系统开发环境中已十分广泛;但就目前而言,嵌入式Linux的研究成果与市场的真正需求仍有一段差距,还需要在嵌入式Linux系统的实时性、进程调度等方面对其进行不断的改进和完善。

1改造Linux为嵌入式操作系统的分析实时系统最重要的特征是实时性,实时性是指系统对外部事件的响应和处理要在一个给定的时间内完成,即计算必须在到达死线(deadline)前完成[1]。

根据丢失死线的容忍程度可将实时系统分为硬实时系统和软实时系统:硬实时系统必须保证任务在到达死线之前完成,丢失死线将会引发灾难;软实时系统能保证任务在死线之前完成,但死线的丢失并不会带来致命的错误。

在大多数嵌入式系统应用中往往要求系统具有实时性。

虽然Linux是一个分时操作系统,但其符合POSIX1003.1b关于实时扩展部分的标准,尤其Linux2.6的推出给嵌入式系统以及实时系统的应用带来生机。

将Linux改造为嵌入式实时操作系统具有(1)Linux功能强大、(2)开放源码、(3)支持多种硬件平台、(4)收稿日期:2006-02-21;修回日期:2006-04-03基金项目:江苏技术师范学院科研基金资助项目(KYY04001)作者简介:李红卫(1966-),男,山西阳城人,江苏技术师范学院计算机科学与工程学院副教授。

JOURNALOFJIANGSUTEACHERSUNIVERSITYOFTECHNOLOGY江苏技术师范学院学报Apr.,Vol.12,No.220062006年4月第12卷第2期模块化设计、(5)函数接口符合国际和工业标准等优点[3],但同时也存在一些缺点;Linux毕竟是一个分时系统,在实时性方面无法与商用实时操作系统相比,仍然存在很大差距。

(1)Linux提供的是一种软实时调度算法[4],它对实时任务的调度不做任何保证。

在实现调度算法时,Linux注重的是公平、合理的调度策略,对实时进程采用了基于优先级的先进先出算法和基于优先级时间片轮转算法,这两种调度算法均按静态优先级对实时进程进行调度。

(2)Linux2.6采用了内核可抢占式调度方式,但它的实现仅仅是在内核中增加了抢占点,抢占点设在中断处理程序即将结束时或系统调用即将结束时。

对于强实时系统来说,一旦高优先级的任务进入就绪队列,应立即获得处理机,而调度程序schedule()通常是在中断处理程序结束或系统调用结束时,才有机会运行。

如果中断处理时间过长(中断嵌套)或系统调用占用时间过长,都会延误实时任务的执行;只有保证中断处理程序和系统调用执行时间在一个可控的范围内,才能保证实时任务的正确执行。

(3)时钟粒度粗糙。

时钟中断是驱动操作系统运作的最基本的动力源,系统用它来维持系统时间,监督进程运行,引起进程调度。

进程状态的转变在很多情况下也是由时钟中断直接或间接引起的。

虽然Linux2.6在i386体系结构中时钟粒度定义为1ms,但在其他大多数体系结构(比如ARM)中,时钟粒度仍然定义为10ms,而实时应用一般都需要微秒级的响应精度,10ms的时钟粒度远不能满足实时应用的要求。

综上所述,改造Linux为嵌入式操作系统,可从实时性、进程调度程序、时钟粒度着手进行研究与实现。

2Linux嵌入式操作系统的实时化2.1双内核结构实时化Linux可有多种实现方案,许多研究项目都在进行Linux方面的实时化改造。

采用双内核结构是实时化Linux常用的方案,它是在原有的Linux和硬件之间设计一个专门用于处理实时进程的实时内核,Linux作为此内核的一个优先级最低的任务运行,实时任务在实时内核上运行,非实时任务则在Linux内核上运行。

该方案的结构如图1所示。

这类方案的优点是对Linux内核的改动较小,实现了硬实时和内核可抢占。

采用这种结构的有NewMexicoInstituteofTechnogy的RT-Linux、意大利的RTAI、我国信息产业部基金资助的SOPCA[5]等。

其中RT-Linux开创了Linux硬实时支持的先河。

RTAI的设计更科学,它在硬件与实时内核之间增加了一层实时硬件抽象层RTHAL(real-timehardwareabstractionlayer)。

RTHAL将RTAI需要在Linux中修改的部分定义成一组程序界面,RTAI只使用这组界面与Linux沟通,这样,可以把对内核源码的改动降低到可以控制的程度,使内核移植更便捷。

特别是在最新版本的RTAI中采用了ADEOS(adaptivedomainenvironmentforoperatingsystems)超微内核(ADEOSnanokernel)技术[6],极大地提高了系统的可靠性,也为嵌入式应用方面提供了可抢占的、可伸缩的实时服务。

采用双内核结构支持实时系统的设计方案同样也存在一些缺点[3],所有实时任务都必须用内核模块的格式编写,从而导致实时应用的开发变得非常复杂,要求用户必须熟悉Linux内核和设备驱动程序的设计。

另外一个重要隐患就是,由于实时任务在核心态中运行,没有对内存进行保护,不当的编程可能会导致内核的崩溃;同时,实时程序的调试也很困难。

2.2直接修改Linux内核这类方案的共同点是直接修改内核,主要方法是对它的数据结构、调度函数、中断方式等进行修改,提供适应于实时系统的调度策略、提供细粒度的定时器和增加内核抢占点等,使其能处理实时进程。

典型实例是MontaVista公司的MontaVistaLinux、CELF组织的CELinux和加州大学Irvine分校开发的RED-Linux。

MontaVistaLinux采用标准Linux内核,针对嵌入式设备定制专用的嵌入式操作系统,根据应非实时任务实时任务计算机硬件实时内核Linux内核图1双内核结构Fig.1StructureofTwoKemels江苏技术师范学院学报52第12卷用需求及嵌入式系统资源有限的情况,对内核进行裁减、配置,保证系统稳定,性能突出。

在实时性能方面,它提供一个基于优先级的实时调度器。

对于无实时需求的进程,仍按Linux原有进程调度策略进行调度;对于实时进程,则按照优先级驱动的原则进行调度,实现了一定的抢占式内核。

RED-Linux是在Linux内核的很多函数中插入了抢占点,使得进程在内核态时可以被抢占,从而减小内核的抢占延迟。

另外,RED-Linux的调度器被分为两个构件:分派器(dispatcher)和分配器(allocator)。

分配器是一个由用户创建的用户实时进程,在用户态执行,它负责将应用程序的资源请求转换成内核可以理解的形式。

分派器作为一个内核模块存在,可动态加载并在内核态执行。

实时任务先在分配器中注册自己的调度函数参数,再由分派器调度。

用这种方法,调度策略易于修改。

采用直接修改Linux内核方案的优点是能够充分利用Linux本身所提供的各种功能和服务,系统结构清晰,能够支持众多硬件平台,可以很好地将嵌入式与实时性结合。

它的缺点是实时性能不及双内核方式高,另外直接修改Linux内核源代码进行实时化的工作量大,还可能影响系统的稳定性。

采用该方案的大多数嵌入式Linux内核是不可完全被抢占的,所以只能作为一种软实时方案。

3Linux嵌入式调度算法的优化进程调度的研究是整个操作系统理论的核心[7],在嵌入式操作系统中也不例外。

实时调度算法大致可分为三种:基于优先级的调度算法、基于时间驱动的调度算法和基于比例共享的调度算法[8]。

在Linux内核中调度算法是以优先级驱动的,即调度原则是按优先级的大小决定,并实现了三种调度策略,其中SCHED_FIFO和SCHED_RR应用于实时任务,SCHED_NORMAL应用于非实时任务,实时任务的优先级高于非实时任务的优先级。

SCHED_FIFO指当优先级相同时,按先进先出算法进行调度,它不使用时间片,适合于时间性要求比较强、但每次运行所需时间比较短的进程,采用该策略的进程获得CPU后,除非有更高优先级进程申请运行外,否则该进程将保持运行至退出或自愿放弃CPU;SCHED_RR指优先级相同时按时间片轮转算法进行调度;SCHED_NORMAL是基于优先级按时间片轮转算法进行调度,与SCHED_RR调度策略相似,所不同的是SCHED_RR采用静态优先级对实时任务进行调度,SCHED_NORMAL采用动态优先级对非实时任务进行调度。

因为,实时任务的优先级在运行过程中保持不变,非实时任务的优先级随进程的运行时间、等待时间、是否为交互式进程而动态改变。

在实时系统中,往往要求系统对外部事件的响应和处理要在一个给定的时间内完成,系统输出的正确性不仅依赖于计算的逻辑结果而且依赖于结果产生的时间。

随着时间的变化,实时任务的紧迫程度也在变化。

在基于优先级的调度算法中,实时进程的优先级如果能随着时间的变化而动态地改变,就能客观地反映出实时任务的紧迫程度。

显然,Linux对实时任务按静态优先级进行调度的策略在满足实时性要求时存在瑕疵。

在实时操作系统中,常常面临的另一个问题是优先级反转[9],可描述如下:当高优先级的任务获得运行资格后,发现它所需要的共享资源被某低优先级的任务占用,则该高优先级任务被阻塞;而该低优先级的任务又被中等优先级的任务强占而无法运行,致使高优先级的任务在有效时间内无法获得被低优先级任务所占用的共享资源而迟迟不能运行。

相关主题