Linux支撑PowerPC、MIPS、ARM、DSP等多种嵌入式处理器,逐步被用于多种关键性场合。其间实时多媒体处理、工业操控、轿车电子等特定运用对Linux提出了强实时性需求。Linux供给了一些实时扩展,但需求进行实时性改造。本文针对嵌入式Linux实时化技能中的一些关键问题进行了评论,如Linux内核时延,实时化干流技能方案及其点评等。
Linux内核时延
干流Linux尽管部分满意POSIX 1003.1b实时扩展规范,但还不彻底是一个实时操作体系,首要表现为:
* 使命调度与内核抢占
2.6版别内核添加了许多抢占点,使进程履行在内核代码时也可被抢占。为支撑内核代码可抢占,在2.6版内核中经过选用禁用中止的自旋锁来维护临界区。但此刻如果有低优先级进程在临界区中履行,高优先级进程即便不拜访低优先级所维护的临界区,也有必要等候低优先级进程退出临界区。
* 中止推迟
在干流Linux内核规划中,中止能够抢占最高优先级的使命,使高优先级使命被堵塞的最长时刻不确认。并且,因为内核为维护临界区需求封闭中止,愈加增长了高优先级使命堵塞时刻。
* 时钟精度
Linux经过硬件时钟编程来发生毫秒级周期性时钟中止进行内核时刻办理,无法满意实时体系较高精度的调度要求。内核守时器精度相同也受限于时钟中止,无法满意实时体系的高精度守时需求。
* 其他推迟
此外,Linux内核其他子体系也存在多种推迟。比方为了增强内核功能和削减内存耗费,Linux仅在需求时装载程序地址空间相应的内存页。当被存取内容(如代码)不在RAM中则内存办理单元(MMU)将发生页表过错(Page-Fault)触发页面装载,构成实时进程呼应时刻不确认。
Linux实时化技能开展
干流Linux内核1.x、2.2.x和2.4.x版别的Linux内核无抢占支撑,直到2.6版别的Linux内核才支撑可抢占内核,支撑临界区外的内核抢占和可抢占的大内核锁。在此根底上,Linux选用了下列两类实时化技能。
* 双内核方法
Linux内核实时化双内核方法以RTLinux、RTAI和Xenomai等为典型代表。其间RT-Linux完成了一个微内核实时操作体系支撑底层使命办理、中止服务例程、底层使命通讯行列等。一般Linux作为实时操作体系的最低优先级使命,Linux下的使命经过FIFO命名管道和实时使命进行通讯,如图1所示。
当Linux要封闭中止时,实时微内核会截取并记载这个恳求,经过软件来仿照中止操控器,而没有真实封闭硬件中止,防止了因为关中止所构成的呼应推迟。RT-Linux将体系实时时钟设置为单次触发形式,供给微秒级的时钟精度。RTAI相似RTLinux的完成方法,不同之处在于它修正了体系结构相关代码,构成一个实时硬件笼统层(RTHAL),使其实时使命能在任何时刻中止一般Linux使命,两者之间经过非堵塞行列进行通讯。RTAI将直接修正Linux内核的代码减至最少,具有更好的可移植性。Xenomai以RTAI为根底,也称RTAI /Fusion。选用了Adeos微内核代替RTAI的硬件笼统层。其特征还在于仿照了传统RTOS的API接口,推进传统RTOS运用在GNU/Linux下的移植。相似还有根据Fiasco微内核的L4Linux等开源项目。
* 内核补丁方法
双内核实时方案下,实时使命需求依照微内核实时操作体系供给的别的一套API进行规划。而内核补丁方法则不改动Linux的API,原有运用程序可在实时化后的操作体系上运转,典型的有前期研究性的Kurt-Linux和Red-Linux,商业版别的MontaVista 、TimeSys 和Wind River Linux,以及现阶段Ingo Monlnar等人开发的实时抢占补丁内核等。
Kurt-Linux是第一个根据一般Linux的实时操作体系。经过正常态、实时态和混合态进行实时和非实时使命的区分。RED-Linux经过使命多种特点和调度程序,能够完成多种调度算法。选用软件仿照中止办理,并在内核插入了许多抢占点,进步了体系调度精度。
MontaVista Linux在低推迟补丁以及可抢占内核补丁根底上,经过开发内核O(1)实时调度程序并对可抢占内核进行了改善和测验,Linux 2.4内核年代MontaVista Linux 作为商业老练产品在实时性上有较强的优势。TImeSys Linux经过内核模块的方法也供给了高精度时钟、优先级承继mutex等支撑。
2.6版别的干流内核吸收了以上技能,支撑CONFIG_PREEMPT_NONE,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT等多种装备选项。别离适合于核算型使命体系,桌面用户体系和毫秒级推迟嵌入式体系。2005年,针对2.6内核MontaVista推出了实时Linux方案,推进了Linux内核实时化进程。随后Ingo Molnar发布了新的实时抢占补丁,并逐步成为Linux内核实时干流技能,也为包含MontaVista Linux,Wind River Linux选用和弥补,本文后续内容这要触及实时抢占补丁。
Linux实时化技能及点评
2.6版别Linux内核实时功能有必定增强,双内核方法的Linux实时化技能也在不断开展中。原因由FSMLab维护的RTLinux,其版权在2007年2月被Wind River购买,先对在开源社区就不很活泼,RTAI支撑x386等体系结构,但因为其代码较难维护、bug较难调试等原因,许多开发者参加了Xenomai项目。Xenomai支撑最新2.6版 Linux,相比之下代码相对安稳和可维护,开发形式较活泼。
内核补丁方法的Linux实时化技能在2.6版内核根底上做了很多改善,使得内核中除了中止封闭和IRQ线程分配、调度和上下文切换之外的绝大部分代码都能够被抢占,不行抢占的自旋锁维护临界区从一千多个削减到几十个,使得内核实时性得到极大的进步,取得社区广泛支撑并逐步成为Linux实时化干流技能。
Linux内核实时化改善
实时抢占内核补丁针对Linux各种推迟进行了实时化改善,首要包含了几个方面的技能。
* 实时抢占内核
为了完成内核彻底可抢占,实时内核临界区用高功能优先级承继mutex替换本来自旋锁(spin-lock)来进行维护,使得在临界区内的履行也可被抢占。只有当线程想拜访一个其他线程正在拜访的临界区时,才被调度至睡觉,直到所维护的临界区被开释时被唤醒。
在实时抢占内核中经过优先级承继机制(PI)在线程被一个低优先级线程所持有的资源堵塞时,低优先级线程经过承继被堵塞线程优先级,赶快履行并开释所持资源而不被其他线程所抢占。
* 新式锁机制带来内核功能进步
实时抢占补丁替换了大内核锁(BKL),将BKL从spin lock改成是mutex,持有BKL的线程也能够被抢占,削减了内核调度推迟。此外,实时抢占补丁经过mutex代替semaphore,防止了不必要的时刻负载。实时抢占补丁完成了可抢占的RCU(Read Copy Update)锁和串行化读写锁,确保了履行可猜测性,进步了功能。
* 中止线程化
实时抢占补丁经过内核线程来完成一些硬件中止和软件中止的服务程序。体系结构相关处理代码设置IRQ状况、查看线程化的中止是否使能,并唤醒相关线程。在中止线程被调度履行后,进行中止服务处理。在实时抢占内核中,用户线程优先级能够高于设备中止服务线程。实时使命无需等候设备驱动处理程序履行,减小了实时抢占推迟。
* 时钟体系改善
实时抢占内核的时钟体系从头进行了规划,完成了高精度守时器。时钟精度不再依靠jiffies,使POSIX守时器和nanosleep精度由详细硬件所能供给的精度决议,使得getTImeofday能够供给实时体系所需的准确时刻值。
* 其他改善
Linux在用户层支撑功能杰出的futex,完成原理相似于内核优先级承继mutex,仅在发生竞态时进入内核,进步了运用程序功能。此外,实时抢占补丁内核还供给mutex死锁检测、推迟盯梢与丈量、中止封闭盯梢与推迟丈量、抢占推迟丈量等内核调试与确诊、内核功能丈量与调优等东西、实时Trace支撑( Ftrace)等支撑。
现阶段实时化技能在各体系结构上逐步得到了支撑,如表1所示。
实时抢占内核推迟
现阶段,实时抢占补丁技能仍处于完善过程中,其表现在以下几点缺乏。
* 中止推迟
即便不发生中止线程抢占,实时抢占内核相对本来中止服务机制额定添加一对上下文切换时刻,用于唤醒中止服务线程履行和进入睡觉状况。此外,内核中还存在少数用raw_spinlock锁禁用中止来维护的临界区,需求核算这些锁构成的中止推迟。
* 使命抢占推迟
内核抢占推迟首要是因为在内核中运用各种锁机制用于操控使命和中止对临界区的拜访所构成的,特别是实时抢占内核中为了防止优先级反转添加的锁机制带来了额定时刻负载。
* 内核模块其他推迟
在实时抢占补丁中,内存办理模块还需削减页表过错引起的推迟,下降mlockall内存锁存构成的功能降级影响。实时抢占内核中高精度守时器的运用导致了额定守时器办理时刻负载。此外,内核中一些驱动程序需求针对实时运用进行优化来进步实时呼应。软浮点处理和软浮点内核仿真需求和实时抢占补丁兼容,能耗办理子体系还需求具有实时体系感知才干。
实时抢占内核功能测验
本文在Intel PenTIum M 1.7 GHz处理器进步行了测验。测验环境包含:Linux内核2.6.25.8最小装备;patch-2.6.25.8-rt7实时补丁;libc 2.5+和busybox-1.10.0构建initrdfs方法的根文件体系。
* 中止推迟
选用实时抢占补丁支撑的内核中止推迟丈量东西丈量中止封闭(IRQ OFF)时刻。在100%负载状况下,十万采样点中,最大值在31 us左右,绝大多数在1 us左右,如图2所示。
* 使命抢占推迟
内核抢占封闭时刻选用实时抢占补丁所支撑的内核抢占封闭丈量东西丈量。实时抢占内核和一般Linux内核状况比较如表2所示。
实时运用中周期性使命需求能在确认的时刻内得到履行。实时抢占内核和一般内核下的周期性使命推迟比照中能够看出实时抢占内核供给了实时使命的准确履行,如图3所示。
结语
嵌入式运用对Linux实时性要求越来越多,干流内核逐步参加实时化技能,终究将为实时运用供给完美解决方案。本文总述了Linux内核时延,介绍了Linux内核实时化开展,剖析了内核实时化干流技能,并剖析了实时化技能缺乏之处,为更好地了解Linux实时化技能供给了参阅。