嵌入式Linux系统以其低廉的价格和强大的功能等诸多优势很快发展起来,成为嵌入式操作系统中的新贵。但是嵌入式Linux是按照分时系统的目标设计的,本身为一个通用的分时操作系统而非真正意义上的实时系统。该文主要从系统内核结构对实时性的影响入手进行研究,并采用一定的策略对其实时性进行了改进,分析比较了两者的异同。
1 Linux系统内核结构
1.1 操作系统内核结构
1)式的单内核
单内核也叫集中式操作系统,整个系统可以分成用户程序、系统调用以及硬件控制三个层次和若干个模块。在核心态运行时每一个模块是一个独立的二进制映像或者进程,并且通过直接调用其它模块中的函数来实现通信。如图1所示。
2)层次式的微内核
微内核模式是面向对象理论在操作系统设计中的产物,通过对系统逻辑功能的划分,把操作系统结构中的处理器管理,存储器管理,设备管理和文件管理等高级功能服务模块尽可能从内核中分离出来,成为在一定的特权方式下运行并且具有独立运行空间的独立进程,同时各个进程之间以消息机制来完成信息交换。在内核中仅仅只保留少量的基本功能,如内核进程调度与通信以及内核的内存管理等,使内核变得更加简洁可靠。如图2所示。
1.2 Linux系统内核结构
由于充分利用了分层结构和模块化的特点,所以实时系统通常多采用微内核的体系结构,非常适合于嵌入式环境中高效、紧凑、简洁、易扩展、易剪裁等要求。Linux系统总体上可以分为进程调度模块、内存管理模块、文件系统模块、进程通信模块以及网络接口模块。各个模块之间的关系如图3所示。
Linux系统采用的是单内核模式,同时在单内核模式设计中引入了许多微内核的思想,实践证明这种单内核模式中吸收某些微内核的设计实现方法,使单内核结构更加紧凑,功能更加强大,执行效率更高,性能更稳定。
2 改进内核实时性的两种方案
2.1 双内核法
双内核法其实就是在保持Linux系统原有内核的同时,在最底层的硬件平台之上再增加一个实时核心层来达到改造系统实时性的目的,即是建立了双内核系统。一方面Linux系统原有内核提供了复杂的非实时性通用功能,另一方面实时内核专门负责接受硬件中断信号以及专门对实时任务进行管理,具备了精确的实时多任务调度执行管理的功能。
由于实时核心层直接与硬件层交互访问,所以在整个系统运行过程中始终接受来自硬件层的中断请求信号。当实时核心层捕获到来自底层硬件的中断请求信号时,实时内核用软件模拟常规Linux系统对底层硬件使用或禁止中断的方法来判断该任务是否直接响应,还是转交给非实时Linux内核处理。一方面如果当中断请求信号来自紧迫的实时任务,需要实时核心层来处理时,将抢占Linux内核及时响应该请求;另一方面当中断请求信号来自普通的非实时任务时,需要Linux系统原内核来处理时,则由实时内核将信号传递给上层的Linux内核并作最终的执行。两者之间通常采用共享内存和FIFO设备接口等方法来相互交换信息。双内核实时系统架构如图4所示。
从上分析不难发现,在双内核结构中,只有在系统没有实时任务可运行时,Linux内核才有可能被调度。同时由于双内核机制保留了常规Linux内核,一方面能够充分利用Linux系统本身提供的诸多强大的功能,如TCP/IP网络协议、中文图形环境(X-Window)以及丰富的编程资源等,另一方面以较小的代价提供了较强的实时性并避免了大规模的结构改造。最重要的一点就在于运行在常规Linux内核上的所有非实时任务必须是可抢占式调度的,这样才能对实时核心提供精确的实时保证而没有任何影响。此外,由于实时核心层非常小巧也不会增加系统额外的负担。典型代表就是RT-Linux系统,与此相类似的还有意大利的RTAI(Real-time Application Interface)系统,但两者不同之处在于RTAI系统在需要修改的部分定义了一个抽象硬件层RTHAL(Real-time Hard Abstraction Layer),实时任务通过该抽象层提供的接口和Linux内核进行交互。
2.2 单内核法
单内核方法就是通过修改Linux内核中部分代码来解决内核不可抢占的缺陷,达到改造内核实时性的目的,其根本原则就是有选择的改动而非对整个核心彻底地改变,具体地讲就是在遵循POSIX标准和GPL协议的前提下通过对进程调度与通信模块和内存管理模块以及中断处理机制等部分的修改,使修改后的内核具备基于优先级驱动的完全可抢占式实时调度的性能,缩短系统在关中断条件下的响应时间。典型的例子就是RED-Linux系统和Monta Vista公司的MontaVista Linux系统。RED-Linux一方面采用了独特灵活的内核通用框架GSF(General Scheduling Framework),使得能够满足各种不同复杂场合实时性的需要,另一方面通过在内核代码块中增加抢占点(Preemtion point)的方法来减少内核抢占的延迟。MontaVista Linux系统修改后提供了基于优先级驱动的实时调度器,对无实时需求的普通进程,仍按Linux系统原来进程调度策略进行调度,对于实时进程,则按照基于优先级驱动方式进行调度。
3 两种改进方案的比较
基于双内核法和单内核法的两种不同策略都在一定程度上提高了系统的实时性能,但是两者在内核的实时性和内核代码的可维护性,重用性以及编程模式等方面表现出一些不同。
1)内核的实时性
采用单内核方法,实现了Linux内核的可抢占性调度,提高了内核响应的及时性,但是难以确保实时响应的可靠性。因此这种方法主要应用于软实时系统。而采用双内核方法,由于实时内核基本上独立于Linux内核,所以实时性能具有很高的预测性和可靠性,广泛应用于硬实时系统上。
2)内核代码的可维护性
采用单内核方法对内核代码进行修改时,不仅要保证原有代码在进行修改后仍然支持可抢占性,而且要保证对新加入的代码也要支持可抢占性。其次还需要对修改后的内核进行严格的性能测试以保证有较好的实时性能,显然这一切都使内核的可维护性难度大大增加。而采用双内核方法,原Linux内核代码与实时内核代码基本上是独立的,相互之间基本不影响,这样就大大降低了整个系统核心代码维护的难度。
3)内核代码的可重用性
采用单内核方法主要集中在内核调度代码的修改上,修改后的系统仍然只有一个内核并且内核的系统功能不会发生较大的变化,所以进行其它应用开发时内核代码具有了较好的可重用性。而采用双内核方法进行修改后,增加一个实时内核,针对实时内核的一些系统功能应用开发要从头做起,工作量大大增加。
4)实时任务的编程模式
采用单内核方法只对内核进行了一些与应用程序无关的修改,所以实时任务的编程模式不会发生较大的变化。与此相反,采用双内核方法对内核进行修改后,增加了一个实时内核,而一般情况下实时内核不允许使用Linux系统的内核调用与函数,所以实时任务的编程模式发生了较大的变化。
通过上述两种方案的比较,不难发现第一种方法并没有对Linux内核本身做任何实时性较大的改进,而是避开Linux内核本身,重新设计和实现了新的实时内核。第二种方法则主要集中在对Linux内核本身的修改,但在实际操作上,由于修改系统内核的难度比较大,对于内核不可抢占性的改进也是很有限的,还存在着巨大的改进空间。
4 小结
本文首先介绍了Linux系统的体系结构,分析了内核结构对系统实时性的影响,并讨论了采用双内核法和单内核法对内核实时性改进两种方法的异同。
参考文献:
[1] 赵慧斌,李小群.改善Linux核心可抢占性方法研究与实现[J].计算机学报,2004(27):240-250.
[2] 苏曙光,刘云生.基于RTHAL的Linux研究与实现[J].计算机科学,2009(7):143-148.
[3] 顾胜元,杨丹.嵌入式实时动态内存管理机制[J].计算机工程,2009(20):250-257.
[4] 刘文峰,李程远.嵌入式Linux操作系统的研究[J].浙江大学学报,2009,38(4):447-452.
[5] 赵明富.Linux嵌入式系统实时性分析与实时化改进[J].计算机应用研究,2009(4).
[6] 厉海燕,李新明.Linux抢占式内核的研究与实现[J].计算机工程与设计,2005,26(9).
中国论文网(www.lunwen.net.cn)免费学术期刊论文发表,目录,论文查重入口,本科毕业论文怎么写,职称论文范文,论文摘要,论文文献资料,毕业论文格式,论文检测降重服务。