Linux支持PowerPC、MIPS、ARM、DSP等多种嵌入式处理器小型linux系统,逐步被用于多种关键性场合。其中实时多媒体处理、工业控制、汽车电子等特定应用对Linux提出了强实时性需求。Linux提供了一些实时扩充,但须要进行实时性整修。本文针对嵌入式Linux实时化技术中的一些关键问题进行了讨论,如Linux内核信噪比,实时化主流技术方案及其评价等。
Linux内核码流
主流Linux即使部份满足POSIX1003.1b实时扩充标准,但还不完全是一个实时操作系统,主要表现为:
*任务调度与内核占据
2.6版本内核添加了许多占领点linux time服务,使进程执行在内核代码时也可被占据。为支持内核代码可占领,在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所示。
图1双内核构架的Linux实时化技术
当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和WindRiverLinux,以及现阶段IngoMonlnar等人开发的实时占据补丁内核等。
Kurt-Linux是第一个基于普通Linux的实时操作系统。通过正常态、实时态和混和态进行实时和非实时任务的界定。RED-Linux通过任务多种属性和调度程序,可以实现多种调度算法。采用软件模拟中断管理,并在内核插入了许多占领点,提升了系统调度精度。
MontaVistaLinux在低延后补丁以及可占领内核补丁基础上,通过开发内核O(1)实时调度程序并对可占领内核进行了改进和测试,Linux2.4内核时代MontaVistaLinux作为商业成熟产品在实时性上有较强的优势。TimeSysLinux通过内核模块的形式也提供了高精度时钟、优先级承继mutex等支持。
2.6版本的主流内核吸收了以上技术,支持CONFIG_PREEMPT_NONE,CONFIG_PREEMPT_VOLUNTARY和CONFIG_PREEMPT等多种配置选项。分别适宜于估算型任务系统,桌面用户系统和微秒级延后嵌入式系统。2005年,针对2.6内核MontaVista推出了实时Linux计划,推动了Linux内核实时化进程。随即IngoMolnar发布了新的实时占领补丁,并逐步成为Linux内核实时主流技术,也为包括MontaVistaLinux,WindRiverLinux采用和补充linux web服务器,本文后续内容这要涉及实时占领补丁。
直通车;【腾讯文档】Linux内核源码技术学习路线+视频教程代码资料
Linux实时化技术及评价
2.6版本Linux内核实时性能有一定提高linux time服务,双内核方法的Linux实时化技术也在不断发展中。原先由FSMLab维护的RTLinux,其版权在2007年2月被WindRiver订购,先对在开源社区就不很活跃,RTAI支持x386等体系结构,但因为其代码较难维护、bug较难调试等缘由,许多开发者加入了Xenomai项目。Xenomai支持最新2.6版Linux,相比之下代码相对稳定和可维护,开发模式较活跃。
内核补丁方法的Linux实时化技术在2.6版内核基础上做了大量改进,致使内核中不仅中断关掉和IRQ线程分派、调度和上下文切换之外的绝大部份代码都可以被占领,不可占领的载流子锁保护临界区从一千多个降低到几十个,致使内核实时性得到极大的提升,获得社区广泛支持并逐步成为Linux实时化主流技术。
Linux内核实时化改进
实时占领内核补丁针对Linux各类延后进行了实时化改进,主要包括了几个方面的技术。
*实时占领内核
为了实现内核完全可占领,实时内核临界区用高性能优先级承继mutex替换原先载流子锁(spin-lock)来进行保护,致使在临界区内的执行也可被占领。只有当线程想访问一个其他线程正在访问的临界区时,才被调度至睡眠,直至所保护的临界区被释放时被唤起。
在实时占领内核中通过优先级承继机制(PI)在线程被一个低优先级线程所持有的资源阻塞时,低优先级线程通过承继被阻塞线程优先级,尽早执行并释放所持资源而不被其他线程所占据。
*新型锁机制带来内核性能提高
实时占据补丁替换了大内核锁(BKL),将BKL从spinlock改成是mutex,持有BKL的线程也可以被占领,降低了内核调度延后。据悉,实时占据补丁通过mutex取代semaphore,防止了毋须要的时间负载。实时占据补丁实现了可占领的RCU(ReadCopyUpdate)锁和串行化读写锁,保证了执行可预测性,提升了性能。
*中断线程化
实时占领补丁通过内核线程来实现一些硬件中断和软件中断的服务程序。体系结构相关处理代码设置IRQ状态、检查线程化的中断是否使能,并唤起相关线程。在中断线程被调度执行后,进行中断服务处理。在实时占领内核中,用户线程优先级可以低于设备中断服务线程。实时任务无需等待设备驱动处理程序执行,减少了实时占领延后。
*时钟系统改进
实时占领内核的时钟系统重新进行了设计,实现了高精度定时器。时钟精度不再依赖jiffies,使POSIX定时器和nanosleep精度由具体硬件所能提供的精度决定,致使gettimeofday才能提供实时系统所需的精确时间值。
*其他改进
Linux在用户层支持性能良好的futex,实现原理类似于内核优先级承继mutex,仅在形成竞态时步入内核,提升了应用程序性能。据悉,实时占领补丁内核还提供mutex死锁检查、延迟跟踪与检测、中断关掉跟踪与延后检测、抢占延后检测等内核调试与确诊、内核性能检测与调优等工具、实时Trace支持(Ftrace)等支持。
现阶段实时化技术在各体系结构上逐步得到了支持,如表1所示。
表1Linux实时占领补丁技术支持情况实时占领内核延后
现阶段,实时占领补丁技术仍处于建立过程中,其表现在以下几点不足。
*中断延后
虽然不发生中断线程占领,实时占领内核相对原先中断服务机制额外降低一对上下文切换时间,用于唤起中断服务线程执行和步入睡眠状态。据悉,内核中还存在少量用raw_spinlock锁禁用中断来保护的临界区,须要估算这种锁导致的中断延后。
*任务占领延后
内核占领延后主要是因为在内核中使用各类锁机制用于控制任务和中断对临界区的访问所导致的,非常是实时占领内核中为了防止优先级逆转降低的锁机制带来了额外时间负载。
*内核模块其他延后
在实时占领补丁中,显存管理模块还需降低页表错误导致的延后,增加mlockall显存锁存导致的性能降级影响。实时占领内核中高精度定时器的使用造成了额外定时器管理时间负载。据悉,内核中一些驱动程序须要针对实时应用进行优化来提升实时响应。软浮点处理和软浮点内核仿真须要和实时占领补丁兼容,煤耗管理子系统还须要具备实时系统感知能力。
实时占领内核性能测试
本文在IntelPentiumM1.7GHz处理器上进行了测试。测试环境包括:Linux内核2.6.25.8最小配置;patch-2.6.25.8-rt7实时补丁;libc2.5+和busybox-1.10.0建立initrdfs形式的根文件系统。
*中断延后
采用实时占据补丁支持的内核中断延后检测工具检测中断关掉(IRQOFF)时间。在100%负载情况下,十万取样点中,最大值在31us左右,绝大多数在1us左右,如图2所示。
图2实时占领内核中断关掉延后分布
*任务占领延后
内核占领关掉时间采用实时占领补丁所支持的内核占领关掉检测工具检测。实时占领内核和普通Linux内核情况比较如表2所示。
表2内核任务占领关掉时间分布
实时应用中周期性任务须要能在确定的时间内得到执行。实时占领内核和普通内核下的周期性任务延后对比中可以看出实时占领内核提供了实时任务的精确执行,如图3所示。
图3实时占领内核和普通内核下周期性任务调度延后对比结语
嵌入式应用对Linux实时性要求越来越多,主流内核渐渐加入实时化技术,最终将为实时应用提供完美解决方案。本文综述了Linux内核信噪比,介绍了Linux内核实时化发展,剖析了内核实时化主流技术,并剖析了实时化技术不足之处,为更好地理解Linux实时化技术提供了参考。
原文链接;https://blog.csdn.net/weixin_35675138/article/details/116604874?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164414913016780271975433%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164414913016780271975433&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-12-116604874.nonecase&utm_term=linux%E5%86%85%E6%A0%B8%0A++++++++++++++++++++++++++&spm=1018.2226.3001.4450