微型电脑应用
MICROCOMPUTER APPLICATIONS
2000　Vol.16　No.1　P.16-18



基于微内核的嵌入式实时OS设计
毛卫良　 盛焕烨 　郝琴　徐险峰
摘　要：本文主要阐述了微内核操作系统用于嵌入式实时应用中存在的问题的基础上，从性能、扩展性和灵活性方面提出了改进的思路，并最终给出了一个适合于嵌入式实时应用的微内核操作系统的模型。
关键词：操作系统　微内核　嵌入式　实时
Abstract：This paper at first discusses the problems of Mi crokernel-based Operating Systems (OSs)in the real-time applications and then pr oposes the ideas of their improvement in view of their performances, scalability , and flexibility. In the end of this paper, a Microkernel-based OS model is giv en, which proves suitable in real-time applications.
Keywords：OS　Micro-kernel　embedded　real-time▲
一、引言
　　近年来，随着微处理器技术的迅速发展，嵌入式系统被应用到越来越多领域中。特别是随着掌上型PC、WebTV等的出现和消费电子类设备智能化趋势的发展，嵌入式系统的应用市场更是得到了空前的繁荣。面对竞争激烈的市场，嵌入式系统设计者希望能通过缩短应用开发的超前时间(Lead Time)，并满足嵌入式系统高性能的要求来提高产品的市场竞争力。因此，嵌入式实时操作系统的利用早已经成为事实。但面对当前越来越广的嵌入式应用领域，一个嵌入式实时操作系统能否尽可能适用于各种各样的嵌入式应用(应用的多样性)成了嵌入式系统设计者特别关心的问题，这就对嵌入式实时操作系统的灵活性、可扩展性提出了更高的要求，它们与嵌入式实时操作系统的性能一样，成为衡量嵌入式实时操作系统的重要因素。
　　操作系统的体系结构是影响操作系统灵活性和可扩展性的关键因素，而微内核结构以其精练的内核功能，为实现操作系统的高度灵活性和扩展性提供了一个理想的解决方案。
　　但微内核结构在带来了操作系统高灵活性和扩展性的同时，也带来了操作系统性能的降低，这对于嵌入式实时应用来说是不能允许的，这就在实现上需要对微内核结构作出改进，使其在性能上能满足当前嵌入式实时应用的要求。同时，对微内核结构在灵活性和扩展性上的实现也需要作进一步的改进，以适应嵌入式应用领域的不断拓展。本文正是围绕着这些内容而展开的，并最终给出了一个适合于嵌入式实时应用的微内核框架模型。
二、微内核结构及其带来的问题
1.微内核结构
　　如图1，微内核与传统的内核体系结构(以UNIX分层结构为代表)不同，它通常只保留了进程间通信(IPC)，进程调度等几项功能。它依据客户机-服务器的模型概念，把所有的传统内核中的其他部分以服务器进程的形式运行在微内核的外层，而用户进程则被当作客户机。客户要用到操作系统时，就通过微内核和服务器进程进行通信以获取服务，从这个意义上看，微内核仅仅成了传递消息的工具。同时，微内核验证消息的有效性，并核准对硬件资源的存取，也就是在微内核中实现对资源的保护。

图1 微内核体系结构
　　这种体系结构大大提高了嵌入式操作系统的模块化程序，使系统更加容易被裁剪和扩充，因为操作系统的裁剪和扩充工作已经成为服务器进程的删除和添加。同时，由于操作系统中与硬件有关的细节都包含在小小的微内核中，这样整个操作系统很容易实现CPU之间的移植。此外，服务器进程作为用户态进程运行，有自己的内存保护空间，以标准的IPC方式通信，一个服务器出错，不会导致整个系统的瘫痪，加强了操作系统强壮性。微内核的体系结构还使用户只需要通过增加服务器就可以对操作系统进行扩展，并且不影响原系统的可靠性。最后，这种体系结构还适合应用于多处理机和分布式系统。因此，微内核是一种开放，灵活的构建操作系统的内核结构，它使操作系统具有高度的灵活性和扩展性。
　　2.微内核结构带来的问题
　　系统划分的粒度越精细，必然会造成系统整体性能的下降，这对微内核体系结构来说也是如此。从图1中可以看出，相对于传统的单一操作系统，微内核的模块化程度得到的很大提高，但导致了模块间通信代价的提高：无论是用户进程还是服务器进程，要获得微内核的服务，必须使用远程过程调用(RPC)，在这里通过两个IPC实现；用户进程要获取服务器的服务，更是需要四个IPC才能实现；同时，需要对应的进程上下文切换。而在传统的内核 结构中，只需要一个简单的过程调用即可实现，能常只是微内核通信代价的1/5。因此微内核结构带来的性能下降问题成为影响其应用于实时领域的主要障碍。同时，由于同样的原因限制了微内核结构中原本良好扩展性。
　　微内核中的另外一个问题是其资源管理问题。微内核结构在体系结构上先进于传统的操作系统，但在资源管理方面并未有明显的改进：都是只有有特权的服务器和内核才能管理计算机资源，而不被信任的用户进程则被限制于内核和特权服务器提供的接口，无法直接管理计算机资源。因此，用户进程无法根据具体的应用实现对资源的优化管理，从而限制了操作系统对应用多样性的适应能力，而嵌入式应用正是呈现多样性的特征。
　　因此，为了充分利用微内核体系结构的优点，并实现其在嵌入式实时应用领域中的应用，针对上述的问题，应该对微内核体系结构进行改进。
三、微内核结构的改进
　　1.性能的改进
　　如上所述，降低微内核操作系统性能的最主要原因就是IPC的开销，因此性能的改进主要是围绕IPC而进行。
　　由于IPC的实现主要是通过消息机制来实现，因此，通过对消息机制的改进可以降低IPC的通信代价。消息机制的改进可以从以下几个方面考虑：
　　.消息长度：消息长度是影响消息传递代价的重要因素，因此在微内核设计时，应当即可能的减少传递消息的长度，传输低数量级的消息(轻量级消息)本身就意味着低的通信的代价，例如，QNX中就采用了的20字节数量级的消息。同时，短消息还可以被映射到寄存器中进行传输，寄存器的直接访问将提高2倍的性能。
　　.重量级消息的处理：正如前面对微内核体系结构中的问题的描述，用户进程和服务器进程之间传递的消息需要经过两次拷贝，首先从用户进程到微内核、再从微内核到服务器进程，这对于传递重量级消息来说，代价就相当大。因此一般都要建立消息缓存以降低双重拷贝的代价。但当消息缓存命中失败时，这种消息传递方式在传递重量级消息依然将大大影响系统的性能。同时，这种消息传递方式对不需要缓存的消息来说又是多余的。因此，在处理重量级消息的问题上，可以在消息发送时让发送者临时共享目标进程的空间或采用其他的内存共享方法，这样就直接将消息拷贝到目标进程，这种办法对消息传递来说理论上也将提高2倍的性能。其他IPC服务(例如管道、消息队列)也是可以在这种最基本消息传递服务的基础上实现。QNX操作系统中就使用了它的MULTI-PART消息传递机制来实现消息的直接传递，事实证明，MULTI-PART消息传递机制是QNX高性能的基础。
　　.其它：改进消息机制还可以，接受或发送进程只需读写一个消息中消息头部分，同时直接读写已经为消息分配的缓冲区，避免了消息中数据段的传送和缓冲区的分配。同时，为了避免接受挂起消息时的不必要等待，在需要的进程中可以实现对消息的直接读出，这种机制对高速进行设备轮询的进程中十分有用。此外，还有设置进程优先级以优先某些重要消息的传送等等。
　　除了在消息机制进行改进以提高微内核操作系统的性能外，还可以改进进程/线程的调度策略来提高操作系统的性能。
　　一种方法是，对请求进程来说，发送请求消息按照优先级进行，而服务器进程则根据接受到的消息优先级来安排执行顺序，也就是服务器实现优先级的“消息驱动”。同时，当有高优先级的进程阻塞在忙碌的服务器上时，服务器进程就会提高自己的优先级，从而原来正在得到服务的低优先级的进程就不能请求优先级已经高于自己的服务器进程，只能放弃正在进行的请求，高优先级进程就可以立刻得到所要的服务，实现高优先级进程的抢先式服务。
　　还有一种方法是采用“惰性调度”策略。传统的IPC实现时，由于会引起重新调度，因此需要更新进程/线程的调度队列。由于微内核体系结构中IPC十分频繁，因此进程/线程调度队列的更新也是影响性能的一个因素。“惰性调度”就是直到进程/线程队列被查询时才对它们进行更新。在实现时可以在进程/线程控制块设置特殊标志位，当进行队列查询时，根据标志位将需要移动的进程/线程更新到相应的队列中。这种调度策略虽然有时会造成大量的队列操作，但从整体上来说，能提高操作系统的性能。
　　2.扩展性的改进
　　微内核操作系统的扩展会引起性能的下降，从而限制了微内核原本结构上优越的扩展性的利用，因此以微内核为基础的扩展在实现上需要综合对性能的考虑。这里主要介绍SPIN系统中采用的方法来分析微内核扩展性的改进。
　　SPIN使用语言和链接机制来动态实现微内核服务功能的动态扩展。应用为使用新的操作系统服务能够不载代码到内核中，这样就为满足他们特定的需要实现了一个细粒度的、易裁剪的操作系统界面。操作系统的扩展部分被内核的编译器翻译后动态的链接到内核中，在内核的虚拟地址空间中执行。同时，在具体实现时，为了确保用户代码的安全性，SPIN使用了安全型的语言Modula-3，内核中的编译器对Modula-3代码进行静态分析，同时插入运行时检查代码，从而保证了编译后的代码不会破坏内核的完整性，也不会和其他模块或用户级的代码冲突。SPIN的内核提供了一套用于内存和处理器资源管理的核心服务，内核的扩展模块可以使用这些服务来实现任意的计算。
　　SPIN这种动态下载代码的形式，给实现微内核的扩展性提供了良好的思路。同时，由于这种思想是将代码直接下载到内核中，在系统获得良好扩展性的同时并未增加内核和应用进程之间IPC的数量，因此就不会对系统性能造成很大的影响，但同时也可以看出，这种思想将使原来功能简单的微内核变的复杂，内核中的编译器的编译性能不仅影响着微内核操作系统的性能，而且增加了微内核的大小，这对实现嵌入式应用是很不利的。因此，在设计嵌入式微内核实时操作系统时，应当采用这种动态下载代码的方法来解决微内核扩展性和性能之间的矛盾，但同时也考虑到它的负面影响，应当采取一定的措施，例如将编译器移到内核外部，为编译代码建立缓存等。
　　3.资源管理的改进
　　操作系统的功能就是抽象和保护计算机资源，向上提供一致的接口。但如上所述，微内核体系结构在实现资源管理时，并未给应用进程于很大的自由，这种情形对具有应用多样性特征的嵌入式领域来说是不合适的，因此需要在微内核操作系统中引进新的思想。
　　嵌入式领域应用的多样性特征使微内核操作系统提供统一而又合适的资源控制接口提出了难题，而最好的解决的办法只能是让用户自己去实现对资源的管理和控制，因为只有用户才最清楚进行资源管理的目标。因此，这种思路实际上就是要实现资源管理和保护的分离：用户进程被给予尽可能多的资源管理控制权，处于用户态的服务器进程不再具有特权，而微内核则实现对资源的保护，作为操作系统中的唯一可信任部分。
　　这种思想使得微内核在实现时尽可能的将不需要保护的、原来具有特权的内核和服务器变成没有特权的应用程序。例如，在实现虚拟内存管理时，微内核只要实现对物理页面和用于换页的盘块的保护，但将换页、分配、错误处理等功能可以设置到用户的应用层次中。因此实现资源管理的用户层将具有很强的功能，同时也是很复杂。
　　虽然嵌入式应用有其多样性的特征，但不是所有的应用都需要重新对资源管理作出设计和实现，毕竟全部实现用户层的资源管理并不是一件轻松的事。因此在微内核提供的接口之上提供一个相对通用的应用公共库，供大多数真正的应用程序调用显得很有必要。例如，在公共库中实现虚拟内存、文件系统、网络、进程等等，这样用户就可以以在传统操作系统中使用的方式在此公共库的上层实现应用，将大大加快开发的速度，这正是嵌入式应用设计者愿意看到的。但要强调的是，该公共库的实现并无微内核的特权，用户可以任意修改和替代公共库中的内容。
　　其实这种思想就是MIT Exokernel的主要思想，Exokernel就是上述的微内核，而公共库则被称之为LibOS，Exokernel为实现微内核和LibOS的资源管理和保护提供了一套完整的原则和方法。因此，它可以用来解决微内核在资源管理上存在的问题，提高微内核操作系统在面队嵌入式应用的多样性时的灵活性。
　　4.适合嵌入式实时应用的微内核操作系统模型
　　通过以上的讨论，我们不难形成一个适合嵌入式实时应用的微内核操作系统的模型：
　　由于图1中微内核体系结构良好的模块性和灵活性，在体系结构可以仍然采用图1所示的结构。但考虑到原微内核体系结构应用到嵌入式实时领域而带来的问题，对该体系结构中的各个模块的功能及实现思想应作一修改――主要就是引入前面讨论改进中的各种思想，最终使其适合于嵌入式实时应用。
　　.在IPC的实现上，尽量采用轻量级的消息传递方式，同时考虑到消息传递，特别是重量级在进程间传送时的通信代价，可以采用直接传送的方式。另外还要尽可能考虑采用其他技术，象调度处理、消息缓冲处理等等，用来减少IPC的代价，因为IPC通信代价是影响微内核操作系统实时性能的主要原因。
　　.与SPIN思想和Exokernel思想的结合。为解决微内核体系结构中扩展性和性能之间的矛盾问题，引入SPIN思想中的代码动态下载思想。但为了维护微内核的精练性，在这个模型中，微内核中保留的功能应按照Exokernel资源管理原则和方法的进行确定。同时，引用Exokernel的思想，微内核中的服务器进程已经不再具有同微内核一样的特权，用户可进行修改和替换，也就是Exokernel思想中LibOS以一系列应用层的、无特权的服务器进程的形式存在，用户真正的应用进程依然以客户机的形式获取所需要的服务。对于代码的动态下载，在这个模型中主要表现在进程的下载，无论是用户进程还是服务器进程在运行时都可以被调入内核运行，这种下载方式显然将大大降低进程与微内核，进程之间的IPC通信代价。为方便用户的扩展和维护内核的完整性，同时又不影响系统的性能，安全类型的语言可以考虑Modula-3等安全型语言，同时，编译系统具有良好的性能。但编译器按照Exokernel的思想，应当作为一个服务器进程设置在微内核的外层。
四、结论
　　适合于嵌入式实时应用的微内核操作系统应当在性能、扩展性和灵活性上作出改进，才能真正适合于当前竞争激烈的嵌入式应用领域，因此提出了本文的改进模型。但实现一个完整的操作系统是一件很复杂的工作，本文的模型只是为基于微内核的嵌入式实时操作系统的设计从框架上提供了一些思路，要实现一个操作系统还有很多具体的问题需要讨论和解决。■
作者单位：毛卫良（上海交通大学计算机科学与工程系 上海 200030）
　　　　　盛焕烨（上海交通大学计算机科学与工程系 教授 博士生导师 上海 200030）
参考文献：
［1］QNX Arohitecture, QNX Software Systems Ltd　1999
［2］Dawson R. Engler, The Microkernel Operating System Architecture, Mas sachusetts Institute of Technology　QCT　1998
［3］刘松强编著　《实时计算机系统》　学苑出版社　1994
［4］Michel Gien, Micro-kernel Architecture: Key to Modern Operating Syst em,Chorus System 1991
［5］许　玲　计算机性能评价方法及在性能改进中的应用　《微型电脑应用》　1998年11月　第6期
收稿日期：1999-09-06
