【IT168 技术文档】
OSKIT概述
OSKIT 是美国犹它大学计算机科学系FLUX研究组编写的一套用于架构操作系统内核、服务器和其他OS级软件的框架及模块化的部件和库程序。OSKIT的编写者认为,操作系统中有很大一部分模块是系统必须的,但并不是开发者所感兴趣的,例如系统装入模块,各种标准驱动模块等。使用OSKIT的目的就是使操作系统的开发者集中精力开发他们操作系统中有特色的,或者他们感兴趣的部分,而不必考虑一些繁琐而乏味的细节。为了达到这个目的,OSKit在设计时借用了COM的思想,把操作系统的各个部分设计成尽量独立的COM模块,以方便操作系统的开发者使用或替换。因此,当开发人员使用这套工具时,可以把它当作一个完整的操作系统来使用,也可以根据需要使用其中的一部分,它还可以作为一套动态链接库,由操作系统及支持程序对它进行调用。
OSKIT的组成
OSKIT把给开发者提供的功能分为三个部分:接口、函数库和部件库。
OSKIT的接口非常清晰,而且是面向对象的,它采用了部件对象模型(COM)的架构 ,在文章的后续部分会对OSKIT中的COM接口的组织和结构进行详细的讨论。
OSKIT的函数库使用传统的C语言,并采用面向函数的方式向用户提供服务。例如基本的C库函数,这些函数易于使用和控制,目标操作系统能很方便的使用其中的某个函数,而且各个函数之间的依赖关系已被缩减至最小。这些函数库中很少使用OSKit自己的COM接口,取而代之的是在普通的C头文件中定义面向函数的接口。这种设计策略为操作系统设计人员提供了最大程度的支持和灵活性,以适合任何特殊的操作系统环境。
下面是OSKIT目前提供的主要函数库列表,以及它们的简介:
liboskit_c:一个简单的最小限度的C库,它在一个受限制的OS环境中提供了通用的C库支持,并使对环境和其他模块的依赖达到最小限度。在需要一个更完整的、类POSIX的C函数库的情况下,可以使用FreeBSD的C函数库,甚至是用自己编写的函数库来代替这个最小化的C库。
liboskit_kern:建立一个基本的操作系统内核运行环境所需的内核支持代码,该函数库为陷入和中断等提供缺省的处理程序。这个库包括很多在写核心代码时非常有用的通用工具,如访问某个CPU寄存器,建立并维护页表,在不同的处理器模式间转换等。
liboskit_smp:内核支持代码,这个库可建立一个便于操作系统使用的多处理器系统环境。
liboskit_com:处理COM接口的工具函数和一套通用的包装部件。
liboskit_dev:这个库提供了驱动程序和由其它操作系统引入的部件(如网络、文件系统)在OSKit中使用时所需要的转换函数的缺省实现,这些函数工作在OSKit驱动程序框架之中。这些函数的缺省实现是为使用了liboskit_kern库的简单内核所设计的,开发者在必要时可以重写部分或全部函数。
OSKIT的部件库提供了一个一般情况下更高层的功能,这种功能以一种更加标准、精心修整的、面向对象的"黑盒"方式设计。尽管OSKit的"部件"缺省情况下也是被打包成为普通的链接库,但它们的结构则是被设计成面向对象的,而不是传统的面向函数的方式。与OSKit的函数库相比,部件库通常只对外开放一些相关的公用调用接口,而不是大量的功能。例如,在Linux和BSD驱动程序部件库,每一个完整的驱动程序仅实现成为一个单独的函数调用,这个调用用来初始化并注册驱动程序。目标系统通过OSKit的面向对象的COM接口来与这些部件进行交互,这允许很多部件及部件的实例共存,并以操作系统开发人员定义的方式交互。这种设计的策略有利于将已有系统(如BSD和Linux)中的代码并入OSKit,那时,隐藏原有环境的细节要比提供灵活性更重要。
下面是目前OSKit所提供的主要部件库的概要。
liboskit_posix:增加对用POSIX构造的系统通常会实现的系统调用的支持。例如:open、read和write等。这些POSIX操作被映射到相应的OSKit COM接口上。最小化的C库和FreeBSD C库都依赖POSIX库来提供所需要的系统级操作。
liboskit_freebsd_c:源于FreeBSD的完整的类POSIX C库,提供了对单线程和多线程的支持。在需要支持类POSIX函数或线程安全时,这个库可以用来替换最小化的C库。
liboskit_freebsd_m:完整的标准数学库。可以提供浮点数支持。
liboskit_fsnamespace:文件系统名字空间库,为应用程序提供了命名接口,可以将多种部件的绝对和相对路径名转换成为oskit_file和oskit_dir的COM对象。
liboskit_rtld:运行时链接、装入库,允许ELF格式的OSKit内核装入共享库。
liboskit_lmm:一个灵活的存储管理库,它可以管理物理内存或虚拟内存。
liboskit_amm:地址映射管理库,用于管理系统资源。
liboskit_svm:简单虚存库,它使用AMM 库定义了一个简单的用于单独地址空间的虚存接口,提供内存保护和为块设备如一个硬盘分区进行分页。
liboskit_threads:这个库提供了多线程的内核支持,包括POSIX线程、同步、调度和栈保护。
liboskit_diskpart:一个能够识别多种常见的磁盘分区方案并生成一个完整映射的通用库。这个库提供了一个简单的方法让操作系统可以找到它所"感兴趣的"磁盘分区。
liboskit_fsread:一个简单只读文件系统解释库,它可用于不同的文件系统,包括BSD FFS、Linux ext2fs和MINIX的文件系统。它通常与liboskit_diskpart一起使用,为操作系统提供从硬盘或软盘上读取程序和数据的功能。这个库也可用于构造装入程序。
liboskit_exec:一个通用的可执行程序解释器和装入器,它支持流行的可执行程序格式,如a.out和ELF。
liboskit_linux_fs:对Linux内核2.0.29版的文件系统部分代码进行包装。
liboskit_netbsd_fs:对NetBSD 1.2版的文件系统部分代码进行包装。
liboskit_memfs:一个简单的基于内存的文件系统,对外提供了标准的OSKit文件系统接口。
liboskit_freebsd_net:对FreeBSD 2.1.7.1版网络代码的包装。
liboskit_linux_dev:对Linux内核2.0.29版的设备驱动程序进行包装。将其包装在OSKit的设备驱动架构中。
liboskit_freebsd_dev:对FreeBSD 2.1.7.1版的设备驱动程序进行包装。将其包装在OSKit的设备驱动架构中。
OSKIT的设计原则
尽管当前OSKIT的目标平台是X86体系,但将来它会被移植到其它的体系,如StrongArm。
OSKIT的接口被尽可能地设计成便于移植。尽管很大一部分的OSKit代码是与平台相关的,但它很多的功能接口都是通用的,并且可以在很多其它的体系结构或平台上使用。例如,OSKit的设备驱动程序接口是完全可以移植的。
OSKIT在每一个库中记录模块间的依赖信息。对于函数库,这意味着要标明不同的函数间的依赖关系;对于部件库,这意味着要标明每一个库中不同部件集之间的依赖关系。
OSKIT的配置
OSKit遵从GNU的配置、编译和安装习惯:可以参考源代码根目录中的INSTALL文件,在该文件中有使用GNU配置文件的通用方法。简单的说,需要运行OSKit根目录中的配置文件,这个文件将会估计出当前系统的类型以及各种所需工具(如C编译器)的位置。OSKit可以配置成在它自己的目录中编译,只要在OSKit源码的根目录中用./configure命令就可以了。或者可以将OSKit编译并安装到一个单独的目标目录中,如果需要这样,只要在那个新的目录中运行配置文件就可以了。例如,当源文件存在NFS分区上时,使用一个单独的目标目录,可让你把目标文件放在本地的硬盘上。
此外,OSKit的配置还可以保留多份(当然是在不同的目录中),每一套配置有自己的目标文件,但共享一份代码。
当需要为另一种体系结构对OSKit进行交叉编译时,需要指定宿主机(需要运行OSKit的机器)的类型和编译机(编译OSKit的机器)的类型,这可以用configure中的-build=machine和-host=machine选项来实现。由于OSKit是一个单独的软件包,并且不使用任何它自己以外的包含文件和库文件,因此宿主机的操作系统部件与OSKit的配置并没有直接的关联。然而,在配置脚本运行时会需要以对宿主机的指定作为一个前缀来寻找各种交叉编译工具。例如,如果指定"-host=i486-linux",配置脚本会去寻找名为i486-inux-gcc、i486-linux-ar和i486-linux-ld等的编译工具。在其它工具中,具体使用哪一个工具,由目标文件的格式来决定(如ix86-linux-*工具可以建立ELF格式,而ix86-mach-*工具建立a.out格式)。