当前位置首页 > 百科> 正文

RTlinux

2019-09-04 22:52:48 百科

RTlinux

RTLinux(AReal-Time Linux,亦称作实时Linux)是Linux中的一种实时作业系统。它由新墨西哥矿业及科技学院的V. Yodaiken开发。目前,RTLinux有一个由社区支持的免费版本,称为RTLinux Free,以及一个来自FSMLabs的商业版本,称作RTLinux Pro。

系统介绍

RTLinux是由美国新墨西哥州的fsmlabs(finite state machine labs, 有限状态机实验室)公司开发的、利用linux开发的面向实时和嵌入式套用的作业系统。在rtlinux宣言中,这样描述rtlinux : rtlinux is the hard realtime variant of linux that makes it possible to control robots, data acquisition systems, manufacturing plants, and other time-sensitive instruments and machines。
到目前为止,RT-Linux已经成功地套用于太空梭的空间数据採集、科学仪器测控和电影特技图像处理等广泛领域,在电信、工业自动化和航空航天等实时领域也有成熟套用。随着信息技术的飞速发展,实时系统已经渗透到日常生活的各个层面,包括传统的数控领域、军事、製造业和通信业,甚至连潜力巨大的信息家电、媒体广播系统和数字影像设备都对实时性提出了愈来愈高的要求。
RT-Linux开发者并没有针对实时作业系统的特性而重写Linux的核心,因为这样做的工作量非常大,而且要保证兼容性也非常困难。将linux的核心代码做一些修改,将linux本身的任务以及linux核心本身作为一个优先权很低的任务,而实时任务作为优先权最高的任务。即在实时任务存在的情况下运行实时任务,否则才运行linux本身的任务。RT-Linux能够创建精确运行的符合POSIX.1b标準的实时进程;并且作为一种遵循GPL v2协定的开放软体,可以达GPL v2协定许可範围内自由地、免费地使用、修改和再发生。
它是Linux在实时性方面的扩展,採用已获得专利的双核技术:一个微型的RTLinux核心把原始的Linux核心作为它在空闲时的一个执行绪来运行。这开启了在两个不同的核心层面上――实时的RTLinux核心和常用的,非实时的Linux核心――运行不同程式的新方式。原始的Linux核心通过RTLinux核心访问硬体。这样,所有硬体实际上都是由RTLinux来进行管理的。有两种不同的RTLinux版本:RTLinux/Free(或者RTLinux/Open)和RTLinux/Pro. RTLinux/Pro是一个由FSMLabs开发的完全商业版本的实时linux。RTLinux/Free是一个由社区开发的开源版本。

标準Linux

现有的Linux是一个通用的作业系统,虽然它採用了许多技术来提高系统的运行和反应速度,但它本质上不是一个实时作业系统,套用于嵌入式环境中还存在诸多的不足。具体表现如下:

关中断问题

在系统调用中,为了保护临界区资源,Linux处于核心临界区时,中断会被系统禁止,这就意味着如果当前进程正处于临界区,即使它的优先权较低,也会延迟高优先权的中断请求。在实时套用中,这是一个十分严重的问题。

进程调度问题

Linux採用标準的UNIX技术使得核心是不可抢占的。採用基于固定时间片的可变优先权调度,不论进程的优先权多幺低,Linux总会在某个时候分给该进程一个时间片运行,即使同时有可以运行的高优先权进程,它也必须等待低优先权进程的时间片用完,这对一些要求高优先权进程立即抢占CPU的实时套用是不能满足要求的。

时钟问题

Linux为了提高系统的平均吞吐率,将时钟中断的最小间隔设定为10ms,这对于一个周期性的实时任务,间隔要求小于10ms时,就不能满足实时任务的需要。如果要把时钟 的间隔改小以满足周期性的实时任务的需要,由于Linux的进程切换比较费时,时钟中断越频繁,而花在中断处理上的时间就越多,系统的大部分时间是调用进程调度程式进行进程调度而不能进行正常的处理。
RTLinux的特点
在Linux 作业系统中,调度算法(基于最大吞吐量準则)、设备驱动、不可中断的系统调用、中断禁止以及虚拟记忆体的使用等因素,都会导致系统在时间上的不可预测性,决定了Linux作业系统不能处理硬实时任务。RTLinux为避免这些问题,在Linux核心与硬体之间增加了一个虚拟层(通常称作虚拟机),构筑了一个小的、时间上可预测的、与Linux核心分开的实时核心,使得在其中运行的实时进程满足硬实时性。并且RTLinux和Linux构成一个完备的整体,能够完成既包括实时部分又包括非实时部分的複杂任务。

实现机理

RT-Linux对Linux核心进行改造,将Linux核心工作环境做了一些变化,如图1 所示:
RTLinux有两种中断:硬中断和软中断。软中断是常规Linux核心中断。它的优点在于可无限制地使用Linux核心调用。硬中断是安装实时Linux的前提。依赖于不同的系统,实时Linux下硬中断的延迟是15μs。
图1 RTLinux对Linux核心改变图1 RTLinux对Linux核心改变
RTLinux的体系结构如图2 所示。RTLinux的设计思想是:套用硬体的实时约束将实时程式分割成短小简单的部分,较大部分承担较複杂的任务。根据这一原则,将应用程式分为硬实时和软实时(即程式)2个部分。
 图2 RTLinux的体系结构 图2 RTLinux的体系结构
硬实时的实现:
图3所示的是RTFIFO结构图。RTLinux将标準Linux核心作为简单实时作业系统(RTOS)(或叫子核心)里优先权最低的执行绪来运行,从而避开了Linux核心性能的问题。 从图3可以看出,RTLinux拥有两个核心。这就意味着有两组单独的API,一个用于Linux环境,另一个用于实时环境。此外,为保证实时进程与非实时Linux进程不顺序进行数据交换,RTLinux引入了RT-FIFO伫列。RT-FIFO被Linux视为字元设备,最多可达150个,分别命名为/dev/rtf0、/dev/rtf1……/dev/rtf63。最大的RT-FIFO数量在系统核心编译时设定。
图3 RT-FIFO结构图图3 RT-FIFO结构图
RTLinux程式运行于用户空间和核心态两个空间。RTLinux提供了应用程式接口。藉助这些API函式将实时处理部分编写成核心模组,并装载到RTLinux核心中,运行于RTLinux的核心态。非实时部分的应用程式则在Linux下的用户空间中执行。这样可以发挥Linux对网路和资料库的强大支持功能。
软实时的实现:
RTLinux通过一个高效的、可抢先的实时调度核心来全面接管中断,并把Linux作为此实时核心的一个优先权最低的进程运行。当有实时任务需要处理时,RTLinux运行实时任务;无实时任务时,RTLinux运行Linux的非实时进程。其系统结构见图4。
RTLinux在默认的情况下採用优先权的调度策略,即系统调度器根据各个实时任务的优先权来确定执行的先后次序。优先权高的先执行,优先权低的后执行,这样就保证了实时进程的迅速调度。同时RTLinux也支持其它的调度策略,如最短时限最先调度(EDP)、确定周期调度(RM)(周期段的实时任务具有高的优先权)。RTLinux将任务调度器本身设计成一个可装载的核心模组,用户可以根据自己的实际需要,编写适合自己的调度算法。
对于一个作业系统而言,精确的定时机制虽然可以提高任务调度器的效率,但会增加CPU处理定时中断的时间开销。RTLinux对时间精度和时钟中断处理的时间开销进行了折中考虑。不是像Linux那样将8254定时器设计成10ms产生一次定时中断的固定模式,而是将定时器晶片设定为终端计时中断方式。根据最近的进程的时间需要,不断调整定时器的定时间隔。这样不仅可以获得高定时精度,同时中断处理的开销又最小。
图4 RTLinux系统结构图图4 RTLinux系统结构图

主要功能

RTLinux提供了一整套对硬实时进程的支持函式集。在此,对在嵌入式系统中的实现加以阐述。
a.中断仿真
在中断控制硬体与LINUX核心之间放置一个软体仿真层。具体做法是,在LINUX源码中出现cli、sti和iret的所有地方都用仿真宏:S_CLI、S_STI和S_IRET来替换。所有的硬体中断就都被仿真器所截获。
当需要关中断时,就将仿真器中的一个变数置0。不论何时若有中断髮生,仿真器就检查这个变数。如果是1(LINUX已开中断),就立即调用LINUX的中断处理程式;否则,LINUX中断被禁止,中断处理程式不会被调用,而是在保存着所有挂起中断的信息的变数的相应位置1。当LINUX重新开中断,所有挂起中断的处理程式都会被执行。这种仿真方式可以称之为"软中断"。
b.实时任务
实时任务是在一个由核心控制的调度程式的调度下执行的用户定义的程式。
RT-LINUX最初将实时任务设计成ELF格式的目标档案。这一设计方案的最大缺点就是性能比较差。原因在于,第一,486的快取是虚拟的。所以每当页表目录的基址暂存器改变时,TLB(转换后备缓冲器)就会失效。由于实时任务的上下文转换频繁,所以TLB的频繁失效就导致系统性能的严重下降。第二,486的保护级别变换耗时不少。比如,陷入更高级别时需要71个循环,而其它指令一般少于10个循环。
解决的办法就是使用可载入模组技术,所有的实时任务都同处于一个地址空间-核心地址空间,不仅避免了频繁的TLB失效,同时也消除了变换保护级别的消耗,而且任务转换也变得相当容易。
c.进程调度
实时系统的进程调度的主要任务就是满足实时任务在时间上的要求。调度算法的种类很多,没有一个策略是放之四海而皆準的,因此採用哪种算法要取决于具体套用。
RT-LINUX採用的方法是允许用户编写自己的调度程式,并可以编译成模组的形式。这样就可以方便地试验不同的策略和算法对于某一特定套用的适合性,从中选出最优。
RT-LINUX自带的是一个基于优先数的抢占式调度程式。此调度程式将LINUX当作具有最低优先数的实时任务。因此,LINUX只在实时系统无任何实时任务是才运行。在从LINUX切换到实时任务时,系统记下软中断的状态并禁止软中断。在切换回来实,再恢复软中断的状态。
d.时钟
调度程式需要精确的时钟才能準确操作。调度通常是在特定的时刻进行任务切换。时钟的偏差会引起预定调度的偏差,导致产生被称为任务发布抖动的现象。这是一种应该儘量避免的不良现象。
RT-LINUX的解决办法是,将IBM PC兼容机中的时钟晶片Intel 8254设定为中断开启终端计数模式。在这种模式下,精度可以达到1毫秒。这样在降低中断处理的影响的同时,获得了较高的时钟精度。
e.IPC
由于标準LINUX核心可以被实时任务在任意时刻抢占,所以实时任务无法安全地调用LINUX的程式。但是总要有一个信息交换的机制。
在RT-LINUX中所用的信息交换方式是RT-FIFO(实时伫列)。它与UNIX的管道非常相似,都是一个无结构的数据流。通过RT-FIFO,LINUX的进程之间,实时进程之间,以及LINUX的核心与实时进程之间可以交换信息。
对于一个普通的进程来说,RT-FIFO就是一个特殊的字元档案。这些档案必须自建:
# for i in 0 1 2 3; do mknod /dev/rtf$i c 63 $i; done

工作原理

RTLinux通过硬体和作业系统间的中断控制来支持硬实时(确定性)操作。进行确定性处理所需要的中断由实时核心加工,其他中断被送往非实时作业系统。作业系统运行为低优先权执行绪。先进先出管道(FIFOs)或共享记忆体可以被用来在作业系统和实时核心之间共享数据。RTlinux是原始码开放的具有硬实时特性的多任务作业系统,它是通过底层对Linux实施改造的产物。通过在L inux核心与硬体中断之间增加一个精巧的可抢先的实时核心,把标準的Linux核心作为实时核心的一个进程与用户进程一起调度,标準的Linux核心的优先权最低,可以被实时进程抢断。正常的Linux进程仍可以在Linux核心上运行,这样既可以使用标準分时作业系统即Linux的各种服务, 又能提供低延时的实时环境 。
RTlinux
RTLinux是美国新墨西哥州大学计算机科学系VictorYodaiken和Micae Brannanov开发的。它在Linux核心的下层实现了一个简单的实时核心,而Linux本身作为这个实时核心的优先权最低的任务,所有的实时任务的优先权都高于Linux系统本身的以及Linux系统下的一般任务。RTLinux的体系结构如图1所示。
将应用程式分为硬实时和程式2个部分。硬体实时部分被作为实时任务来执行,并从外部设备拷贝数据到一个叫做实时有名管道(RTFIFO)的特殊I/O连线埠;程式主要部分作为标準Linux进程来执行。它将从RTFIFO中读取数据,然后显示并存储到档案中,实时部分将被写入核心。设计实时有名管道是为了使实时任务在读和写数据时不被阻塞。图2所示的是实时有名管道结构图。
RTLinux通过对标準Linux核心进行改造,将Linux核心工作环境作了一些变化。如图2所示,在Linux进程和硬体中断之间,本来由Linux核心完全控制,在Linux核心和硬体中断的地方加上了一个RTLinux核心的控制。Linux的控制信号都要先交给RTLinux核心进行处理。在RTLinux核心中实现了一个虚拟中断机制,Linux本身永远不能禁止中断,它发出的中断禁止信号和打开中断信号都修改成向RTLinux传送一个信号。如在Linux里面使用“SI”和“CLI”宏指令,让RTLinux里面的某些标记做了修改。也就是说将所有的中断分成Linux中断和实时中断两类。如果RTLinux核心接收到的中断信号是普通Linux中断,那就设定一个标誌位;如果是实时中断,就继续向硬体发出中断。在RTLinux中执行STI将中断打开之后,那些设定了标誌位表示的Linux中断就继续执行,因此,CLI并不能禁止RTLinux核心的运行,却可以用来中断Linux。Linux不能中断自己,而RTLinux可以。
这里体现了RTLinux设计过程中的原则:在实时模组中的工作量儘量少,如果能在Linux中完成而不影响实时性能的话,就儘量在Linux中完成,因此,RTLinux核心可以儘量做得简单。在RTLinux核心中,不应该等待资源,也不需要使用共享旋转锁。实时任务和Linux进程之间的通信也是非阻塞的,从来不用等待进伫列和出伫列的数据。RTLinux将系统和设备的初始化交给了Linux 完成,对动态资源的申请和分配也交给了Linux。
RTLinux使用静态分配的记忆体来完成硬体实时任务,因为在没有记忆体资源的时候,被阻塞的执行绪是不可能具有实时能力的。
声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net