1 引言
当前,操作系统的功能不断扩展,操作系统的类型呈现出多样化的趋向。一个小规模的开发小组已经不可能完全从头开始实现一个实用的操作系统,而一般情况下,探究人员只对操作系统的一些特定领域感喜好,而对于另外一些元素,如启动加载代码、核心启动代码、设备驱动程序和内存分配代码等往往不感喜好,但是一个可运行的原型系统又必须包含这些内容。编写这些基础结构延缓了操作系统探究项目的进度,同时也增加了进行操作系统探究的代价。为了解决这一新问题,犹他大学的flux探究小组开发了oskit,它提供了一个框架和一组模块化的、具有简单接口的库以及一组清楚的、可重用的os组件。oskit可以用来构建操作系统内核、外层服务和其他核心os功能模块。oskit提供了各种功能模块,诸如简单自举,一个可用于内核的最小化posix环境、和物理内存和其约束一致的内存管理、广泛的调试支持,以及高层子系统如协议栈和文件系统。开发者可以根据自己的探究喜好或所要考虑的性能来使用这些模块,或用他们自己的模块来替代标准的oskit模块。
oskit公开了它内部的实现细节,答应用户从成熟的操作系统中不加修改地提取代码,然后通过一小部分经过仔细设计的粘接代码将它们合并到一起,隔离它们的依靠性,并输出良好定义的接口。oskit使用这一技术整合了许多稳定而成熟的源代码,包括设备驱动、文件系统、网络协议等等。实践表明,使用组件软件架构和重用技术会给操作系统实现领域带来大的影响。
2 组件技术简介
组件技术是一种较新的软件开发技术。wWw.133229.cOm到目前为止,还难以确定组件技术的明确定义。比如,对组件技术的常见说法有以下这些摘要:“二进制软件单元”、“任意场合可部署的软件”、“非凡适合第三方开发”和“规范定义的接口”等等。大致上可以这样理解摘要:所谓组件,其实就是一种可部署软件的代码包,其中包括某些可执行模块。组件单独开发并作为软件单元使用,它具有明确的接口,软件就是通过这些接口调用组件所能提供的服务,多种组件可以联合起来构成更大型的组件乃至直接建立整个系统。组件的实现必须支持一种或者多种其用户所希望获得的接口。实现组件并不一定需要采用面向对象语言。为了构造新应用程序,软件开发人员找出适当的组件,将这些组件加入到正在开发中的应用程序,同时对应用程序进行测试并保证应用程序的组装工作按照预定的规划正常进行。采用组件技术能降低开发、测试和维护成本,提高可靠性和稳定性。
3 oskit组件综述
oskit的组件库提供了一般情况下更高层的功能,它通常只对外开放一些相关的公用调用接口。目标系统通过oskit的面向对象的com接口来和这些组件进行交互。以下几节概述了oskit所提供的组件。
3. 1 引导程序
大多数操作系统多有自身的启动加载机制,彼此互不兼容。这种加载机制的多样性并不是由于每个os所要求的自举服务不同而引起,而是由于构建启动加载器的特定方式造成的。因为从操作系统探究的立场来看,启动加载器是一个令人不敢喜好的领域,因此os开发者通常进行一个最小化、快捷的设计。由于设计理念和要求的稍微差别,每个启动加载器都不适用于下一个os。为了解决这个新问题,oskit直接支持多启动标准,这一标准是由几个os项目的成员共同设计的,它的目的是提供一个简单而通用的启动加载器和os内核间的接口,从而答应一个启动加载器加载任何兼容的os。
在进行操作系统探究时,多启动标准非常有用,这其中的主要原因是启动加载器在加载内核自身的同时还具有加载附加文件或者启动模块的能力。这里的一个启动模块只是一个普通文件,启动加载器不以任何方式解释它,而仅仅把它随同内核映像一起加载到保留物理内存块中。在启动内核时,启动加载器提供给内核以下内容摘要:物理地址的列表、所有已加载的启动模块的大小,以及和每个模块相联系的由用户定义的字符串。这些启动模块和和它们相联系的用户定义的字符串由内核解释。这样做的目的是为了通过提供内核启动时需要的数据,诸如初始化程序、设备驱动和文件系统服务器,来减轻内核启动的负担。
3.2核心支持库
oskit核心支持库的主要用途是让客户os更轻易访问硬件设施。它包含了一个较大的实用函数和符号定义的集合,该集合对于管理模式代码是非常具体的。和此相对应,oskit的大多数其他库在用户模式代码中通常很有用。和oskit的其余部分所不同的是,多数核心支持代码必须是针对特定系统结构的,而这些特定机器的细节对客户os也是有用的。例如,在x86机器上,核心支持库包含一些函数,用来创建和操纵x86页表和段寄存器。其他oskit组件通常提供建立在这些低层机制上的和体系结构无关的设施,但是为了提供最大的灵活性,和特定结构相关的接口始终可以被访问。
oskit核心支持库在x86体系结构上尤为重要,因为该体系结构的os级编程环境非凡复杂和模糊。核心支持库仔细地设置了一个基本的32位执行环境(为了和ms-dos兼容,x86处理器通常以16位模式开始),初始化段和页转换表,安装一个中断向量表,并提供缺省的陷阱和中断处理程序。当然,客户os能够修改或重载这些行为。然而,在缺省情况下,核心支持库自动地做所有必要的工作,以便使处理器进入一个方便的执行环境,此时中断、陷阱、调试以及其他标准设施已经如预期的那样开始工作。该库在缺省情况下自动地定位所有随内核加载的启动模块,并保留它们所在的物理内存。接下来,应用程序可以很轻易使用它们。客户os只需以标准c语言风格提供一个main()函数。一切都设置好以后,内核支持库将用所有参数和由启动加载器传递过来的环境变量来调用它。
3.3内存管理库
如同在一个标准c语言库中实现的malloc()一样,内存管理代码典型地用于用户空间。通常并不适用于内核。设备驱动经常需要分配特定类型的内存,并伴随具体的调整属性。例如,对于内建的dma控制器只能访问最初的16m物理内存。为解决这些内存管理新问题,oskit包含了两个简单而灵活的内存管理库摘要:(1)基于队列的内存管理器(或称lmm),它提供了功能强大且高效的原语来进行分配管理,并支持在一个池中管理多种类型的内存。(2)地址映射管理器(或称amm)被设计用来管理不必直接映射到物理内存或虚拟内存的地址空间,它对os的其他方面提供了类似的支持,诸如进程地址空间、分页、空闲块或ipc名字空间的管理。尽管这些库可以很轻易地应用在用户空间,但实际上它们是被非凡设计用来满足os内核的需求。
3.4 最小c语言库
参考文献
(1) 汤海京 基于面向对象操作系统开发平台(oskit)的分析和程序设计 http摘要://www-900.ibm.com/developerworks/linux/kernel/oskit/part1/index.shtml
(2) michael hohmuth using the oskit as a base for l4 applications
(3) bryan ford kevin van maren jay lepreau stephen clawson bart robinson jeff turner
_ the flux os toolkit摘要: reusable components for os implementation