嵌入式Linux实时化技术

嵌入式 Linux 实时化技术

黄武陵[1] 何小庆[2] 艾云峰[3]
[1]中科院自动化所,北京100190 [2]北京麦克泰软件技术有限公司,北京100086 [3]中科院研究生院,北京100049

《电子产品世界》2009年第2期

 

摘要: Linux 已经被移植到多种 嵌入式 处理器,并得到广泛应用。主流内核实时性能不断增强,但在工业控制等特定场合仍无法满足强实时性需求。本文分析了 Linux 内核时延和实时化主流技术,对实时抢占内核技术进行了分析和评测。
关键词: Linux 内核延迟分析;内核实时化技术;实时抢占内核分析; Linux 实时性

引言

   Linux 支持 PowerPC MIPS ARM DSP 等多种 嵌入式 处理器,逐渐被用于多种关键性场合。其中实时多媒体处理、工业控制、汽车电子等特定应用对 Linux 提出了强实时性需求 [1] 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 所示。


1 双内核架构的 Linux 实时化技术

  当 Linux 要关闭中断时,实时微内核会截取并记录这个请求,通过软件来模拟中断控制器,而没有真正关闭硬件中断,避免了由于关中断所造成的响应延迟。 RT-Linux 将系统实时时钟设置为单次触发模式,提供微秒级的时钟精度。 RTAI 类似 RTLinux 的实现方式,不同之处在于它修改了体系结构相关代码,形成一个实时硬件抽象层( RTHAL) ,使其实时任务能在任何时刻中断普通 Linux 任务,两者之间通过非阻塞队列进行通讯。 RTAI 将直接修改 Linux 内核的代码减至最少,具有更好的可移植性。 Xenomai RTAI 为基础,也称 RTAI /Fusion 。采用了 Adeos 微内核替代 RTAI 的硬件抽象层 [11] 。其特色还在于模仿了传统 RTOS API 接口,推动传统 RTOS 应用在 GNU/Linux 下的移植。类似还有基于 Fiasco 微内核的 L4Linux 等开源项目 [12]

   * 内核补丁方式

  双内核实时方案下,实时任务需要按照微内核实时操作系统提供的另外一套 API 进行设计。而内核补丁方式则不改变 Linux API ,原有应用程序可在实时化后的操作系统上运行,典型的有早期研究性的 Kurt-Linux Red-Linux ,商业版本的 MontaVista [2] TimeSys Wind River Linux ,以及现阶段 Ingo Monlnar 等人开发的实时抢占补丁内核等 [3]

   Kurt-Linux 是第一个基于普通 Linux 的实时操作系统。通过正常态、实时态和混合态进行实时和非实时任务的划分。 RED-Linux 通过任务多种属性和调度程序,可以实现多种调度算法。采用软件模拟中断管理,并在内核插入了许多抢占点,提高了系统调度精度。

   MontaVista Linux 在低延迟补丁以及可抢占内核补丁基础上 [4] ,通过开发内核 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 各种延迟进行了实时化改进 [5] ,主要包括了几个方面的技术。

   * 实时抢占内核

  为了实现内核完全可抢占,实时内核临界区用高性能优先级继承 mutex 替换原来自旋锁( spin-lock )来进行保护,使得在临界区内的执行也可被抢占。只有当线程想访问一个其他线程正在访问的临界区时,才被调度至睡眠,直到所保护的临界区被释放时被唤醒。

  在实时抢占内核中通过优先级继承机制( PI )在线程被一个低优先级线程所持有的资源阻塞时,低优先级线程通过继承被阻塞线程优先级,尽快执行并释放所持资源而不被其他线程所抢占。

   * 新型锁机制带来内核性能提升

  实时抢占补丁替换了大内核锁( BKL ),将 BKL spin lock 改成是 mutex ,持有 BKL 的线程也可以被抢占,减少了内核调度延迟。此外,实时抢占补丁通过 mutex 替代 semaphore ,避免了不必要的时间负载。实时抢占补丁实现了可抢占的 RCU Read Copy Update )锁和串行化读写锁,保证了执行可预测性,提高了性能。

   * 中断线程化

  实时抢占补丁通过内核线程来实现一些硬件中断和软件中断的服务程序。体系结构相关处理代码设置 IRQ 状态、检查线程化的中断是否使能,并唤醒相关线程。在中断线程被调度执行后,进行中断服务处理。在实时抢占内核中,用户线程优先级可以高于设备中断服务线程。实时任务无需等待设备驱动处理程序执行,减小了实时抢占延迟。

   * 时钟系统改进

  实时抢占内核的时钟系统重新进行了设计,实现了高精度定时器 [6] 。时钟精度不再依赖 jiffies ,使 POSIX 定时器和 nanosleep 精度由具体硬件所能提供的精度决定,使得 gettimeofday 能够提供实时系统所需的精确时间值。

   * 其他改进

   Linux 在用户层支持性能良好的 futex ,实现原理类似于内核优先级继承 mutex ,仅在产生竞态时进入内核,提高了应用程序性能。此外,实时抢占补丁内核还提供 mutex 死锁检测、延迟跟踪与测量、中断关闭跟踪与延迟测量、抢占延迟测量等内核调试与诊断、内核性能测量与调优等工具、实时 Trace 支持( Ftrace )等支持。

  现阶段实时化技术在各体系结构上逐渐得到了支持,如表 1 所示。

1 Linux 实时抢占补丁技术支持情况


实时抢占内核延迟

  现阶段,实时抢占补丁技术仍处于完善过程中,其表现在以下几点不足。

   * 中断延迟

  即使不发生中断线程抢占,实时抢占内核相对原来中断服务机制额外增加一对上下文切换时间,用于唤醒中断服务线程执行和进入睡眠状态。此外,内核中还存在少量用 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 所示。


2 实时抢占内核中断关闭延迟分布

   * 任务抢占延迟

  内核抢占关闭时间采用实时抢占补丁所支持的内核抢占关闭测量工具测量。实时抢占内核和普通 Linux 内核情况比较如表 2 所示。

2 内核任务抢占关闭时间分布


  实时应用中周期性任务需要能在确定的时间内得到执行。实时抢占内核和普通内核下的周期性任务延迟对比中可以看出实时抢占内核提供了实时任务的精确执行,如图 3 所示。


3 实时抢占内核和普通内核下周期性任务调度延迟对比

结语

   嵌入式 应用对 Linux 实时性要求越来越多,主流内核逐渐加入实时化技术,最终将为实时应用提供完美解决方案。本文综述了 Linux 内核时延,介绍了 Linux 内核实时化发展,分析了内核实时化主流技术,并分析了实时化技术不足之处,为更好地理解 Linux 实时化技术提供了参考。

参考文献:

[1] 何小庆,比尔 · 温博格 . 移动电话挑战 嵌入式 Linux [J]. 电子产品世界, 2006(12)
[2] Real-Time Linux [R/OL].http://www.mvista.com/real_time_linux.php
[3] Index of /pub/linux/kernel/projects/rt. [R/OL]. http://www.kernel.org/pub/linux/kernel/projects/rt/
[4] WILLIAMS C. Linux Scheduler Latency[R/OL].  (2002-03-20). http://www.linuxdevices.com/articles/AT8906594941.html
[5] D. Hart; J. Stultz; T. Ts’o, Real-time Linux in real time, IBM SYSTEMS JOURNAL, VOL 47, NO 2, 2008
[6] Index of /pub/linux/kernel/people/tglx/hrtimers
R/OL .  http://www.kernel.org/pub/linux/kernel/people/tglx/hrtimers/
[7] Paul E. McKenney,‘Real Time’ vs. ‘Real Fast’: How to Choose?, Proceedings of the Linux Symposium Volume One, 2008 Ottawa, Ontario Canada, p57-p66

 

阅读更多
个人分类: 嵌入式Linux
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭