APP下载

MINIX3操作系统架构及启动过程分析

2011-11-24张治国孙智军

关键词:驱动程序内核进程

张治国,孙智军

(1.河南工程学院 计算机科学与工程系,河南 郑州 451191;2.河南省肿瘤医院 信息科,河南 郑州 450003)

操作系统的实践教学一直都是整个操作系统教学环节中的难点,大多数操作系统原理方面的教材都重理论而轻实践.由于大部分的操作系统源代码是不公开的,学生在学习完操作系统原理之后,对如何构建一个操作系统仍然是一知半解.鉴于这种情况,荷兰阿姆斯特丹自由大学的Andrew教授领导开发了一个用于教学的开放源代码的类UNIX操作系统,这就是MINIX[1]操作系统.由于MINIX操作系统的源代码开放,并且相对于另一个源代码开放的操作系统LINUX,MINIX操作系统更小,代码量更少,使得人们更加容易理解操作系统的构建,从而能够对操作系统做出更好的改进.事实上,LINUX操作系统的作者最初就是以MINIX操作系统为样本,开发了最初的LINUX操作系统内核.由于种种原因,LINUX操作系统得到了商业支持,其内核也变得越来越大,全面地学习LINUX操作系统内核几乎是不可能的.因此,MINIX操作系统仍然是学习操作系统实际构建的第一选择.

1 宏内核与微内核

1.1 宏内核

所谓宏内核指的是操作系统的进程管理功能、存储管理功能、文件系统的实现和设备管理功能等均在内核空间运行[2].这样的操作系统内核包含的可执行代码量大,可以认为宏内核就是一个非常巨大的包含可执行代码的文件.

1.2 微内核

操作系统内核应当被设计得足够健壮,但是宏内核架构的操作系统由于两个方面的主要原因而变得不够稳定和安全,一是操作系统的内核太大;二是没有错误隔离机制.软件的稳定性研究表明,基本上每1 000行的可执行代码中包含6~16个错误,所以对于像LINUX或Windows XP这样内核包含几百万行代码的操作系统,其中包含的错误可想而知的.更糟的是,70%的内核可执行代码都是设备的驱动程序[3],而设备驱动程序更容易出现错误.缺乏有效的错误隔离机制同样也是操作系统容易崩溃的一个原因,因为设备驱动程序、进程管理程序、内存管理程序等都运行在内核空间,所以当其中某一个模块功能出现错误以后,都可能会引起整个内核空间的数据结构被破坏,从而引起操作系统的崩溃.如果有了有效的错误隔离机制,当操作系统的某一功能运行不正常时,人们可以通过某种方法重新启动引起错误的功能模块,从而不会影响操作系统其他功能的正常运行,这样,操作系统内核甚至都感知不到有模块发生错误.

微内核的操作系统就是为了要解决上面提到的问题而提出的[2].在微内核架构的操作系统中,内核被尽可能地设计得足够小.内核代码只完成一些最基本的功能,如中断与异常的管理、最基本的存储管理、对系统中的进程通信进行管理等.操作系统的其他功能,如进程管理、存储器管理、文件管理、设备管理等功能都不是微内核的功能,这些功能也都不在内核空间实现,而全部在用户空间实现.当应用程序需要某些系统服务时,内核只提供消息传递的机制,通知运行在用户空间的进程管理模块或其他的管理模块为用户提供服务.由于操作系统的大多数管理功能转移到了用户空间来实现,所以当某一管理功能出现问题时,并不会引起内核空间的错误,使得操作系统并不会因为某一模块的异常而崩溃.

1.3 宏内核与微内核的对比

微内核架构的操作系统的优点是灵活性好、开放性好和扩充性好,系统的健壮性也比宏内核的操作系统要好.但是,由于微内核的操作系统需要频繁地进行消息的传递,同时也需要不断在内核模式和用户模式之间进行切换,这使得微内核操作系统的效率比宏内核的操作系统效率要低.

2 MINIX3操作系统的内核架构

现在,MINIX操作系统的发展已经历经3代.不同于MINIX1和MINIX2操作系统,MINIX3操作系统内核在设计上与前两代有了根本的改变.MINIX3操作系统不再采用以前的宏内核的设计架构,而是采用微内核的系统架构.MINIX3的内核只有大约4 000行的可执行代码,这与动辄几百万行执行代码的LINUX、WINDOWS、MAC OX操作系统有着明显的区别.

图1 MINIX3操作系统架构Fig.1 Architecture of the MINIX3 operating system

2.1 MINIX3的内部结构

MINIX3操作系统定义4层结构,每一层都完成特定的功能,如图1所示.

从图1可以看出,和其他宏内核的操作系统相比,MINIX3最显著的特点在于,它将操作系统中提供最基本服务的功能,如进程管理、文件系统、设备管理等放在了用户空间执行,而在内核空间只执行一些最基本的进程调度、通信以及一些中断和异常管理程序.

MINIX3操作系统自身是由许多进程组成(层1~层3),这些系统进程之间通过消息传送机制相互通信,用户进程也可以通过消息传送机制与操作系统进程之间通信,从而请求操作系统的服务,这种设计提供了更好的模块机制和灵活性.例如,人们可以不用重新编译操作系统内核就可以用一个新的文件系统替换老的文件系统,这种灵活性在宏内核的操作系统中是不容易实现的.

2.2 MINIX3的内核功能

如图1所示,内核处在系统架构的最底层.内核的主要功能有:(1)管理进程的调度和进程的状态转换.要注意的是,进程的创建、撤销、进程内存空间的分配、进程资源的分配等功能并不在内核中实现,它们全部由用户空间的进程管理(PM)模块实现.(2)内核要处理进程之间的通信.例如,在MINIX3中,如果用户需要创建一个新的进程,就需要向进程管理模块发送一个请求服务的消息,这时就需要调用内核的消息处理功能,内核会检查消息接收者是否合法,分配发送缓冲区和接收缓冲区,然后将数据从发送者复制给接收者.(3)内核代码用来访问I/O端口和处理中断.在现代处理器中,访问I/O端口和处理中断需要内核模式的指令,这些指令都是不能在用户模式下执行的.

在内核空间执行的还有两个模块,一个是时钟任务模块,另一个是系统任务模块.时钟任务模块和产生时钟信号的硬件交互,它为内核的进程调度功能服务,时钟任务模块只与内核作用,用户的应用程序是不能访问时钟任务模块的.系统任务模块的作用是为其上层的设备驱动层和系统服务进程(图1中的层2与层3)提供内核调用接口.例如,因为设备驱动程序需要访问I/O端口,但由于它们处于用户空间,不能直接执行访问I/O端口的指令,所以需要向系统任务模块提出请求,系统任务模块在接收到请求消息之后,与内核交互,最终由内核为其执行指令.尽管时钟任务模块和系统任务模块被编译进了内核的地址空间,但它们在运行时都是独立的进程,也都有各自独立的调用栈.时钟任务模块、系统任务模块以及大部分的内核代码都是用C语言书写的,内核中只有与中断处理相关的代码、进程上下文切换的代码以及与内存管理硬件交互的代码是用汇编语言编写的,这就使得MINIX3可以较为方便地移植到其他的硬件平台上.

2.3 MINIX3的其他层模块

MINIX3系统架构的其他3层都处于用户空间执行,它们都不能执行特权指令,不能执行I/O指令,它们都是作为一个个独立的进程被内核所调度.当然,在这3层之间,它们相对于内核调度而言具有不同的优先级.例如,设备驱动层(层2)的优先级比服务进程层(层3)高,同样层3也比层4的优先级高.优先级高的进程会先被执行,这样可以保证设备驱动程序执行完以后,才会执行进程管理功能.同样,只有当进程管理功能完成执行以后,用户的应用程序才会被调度.

2.3.1 驱动程序层

设备驱动层可以向内核的系统任务进程发出读/写I/O端口的请求消息,包括磁盘、打印机、终端、网卡等设备,都必须有相应的设备驱动程序.设备驱动程序通过内核调用可以将设备读到的数据复制到另一个进程的地址空间中.

2.3.2 服务器层

图1中的第3层也叫做服务器层,它们为用户进程提供必要的服务.在服务器层中,最重要的两个服务是进程管理和文件系统模块.在MINIX3操作系统中,进程管理服务不但实现了进程的创建、启动与终止等系统调用,它还负责存储空间的管理,比如MINIX3的进程管理模块负责实现MALLOC系统的调用.而文件系统模块负责实现所有的文件系统的调用功能,比如READ、WRITE等系统调用.用户的应用程序可以通过系统调用来请求进程管理和文件系统的服务,但是用户的应用程序不能使用内核调用,内核调用只提供给设备驱动程序层和服务器层的模块.

在服务器层中,包含两个MINIX3特有的服务器,一个叫做信息服务器(IS),它主要负责提供其他服务器和驱动程序的调试信息和状态信息,这对于MINIX3用于实验教学方面是非常有用的;另一个服务器叫做再生服务器RS(Reincarnation Server).当RS服务器检测到某一个设备驱动程序出现错误后,RS服务器就会自动重载该设备驱动程序,因为设备驱动程序被放在用户空间运行,这样的重载并不会对操作系统内核产生太大的影响,这就在很大程度上提高了系统的健壮性,也是MINIX3操作系统的一个鲜明的特点.事实上,RS服务器进程是操作系统中除了内核进程之外,所有其他进程的父进程,当某个进程异常终止时,RS进程就会收到一个信号,RS进程通过这种方式可以判断设备驱动程序是否出现了问题.

服务器层也可以包含其他的服务器,比如网络服务器等.服务器层的进程不能直接执行I/O请求,但它们可以通过设备驱动层来请求I/O服务,服务器进程也可以通过系统任务进程与内核进行通信.

3 MINIX3操作系统的引导过程分析

当计算机加电的时候,计算机会按照CMOS中的配置信息去读取启动设备(软盘、硬盘或光盘)的第一个扇区.如果发现第一扇区在第510字节处是0XAA55标志的话,就将第一扇区的内容读取到内存的固定位置0x00∶0x7C00[4]处,并跳转到这个内存区域,执行这里的代码.这个处理过程是由BIOS程序自动完成的,与要加载的操作系统没有关系.

如果MINIX3系统是从软盘引导的,那么加载到0x00∶0x7C00内存处的代码就是MINIX3操作系统的引导程序(BOOTSTRAP),BOOTSTRAP的作用是将一个引导监督程序(BOOT MONITOR)加载到内存地址为0X1000∶0X0030中,并将CPU的控制权将给BOOT MONITOR.然后,BOOT MONITOR程序就会在磁盘上寻找一个文件,就是引导映象文件(BOOT IMAGE),并将其加载到特定的内存位置,这样就完成了MINIX3操作系统的加载.BOOT IMAGE文件主要包含的是内核的可执行代码、系统任务代码、时钟任务代码,还有进程管理、文件系统的可执行代码等,MINIX3的引导映像文件一般都存放在/boot/文件夹下.

如果MINIX3是从硬盘引导的话,情况会有所不同.硬盘可以有多个分区,硬盘的第一个扇区包含有一个分区表和一小段程序,这就是硬盘的主引导记录,被BIOS程序读到0X00∶0X7C00处的主引导记录中包含的程序会将其自身复制到另一个内存地址处0X00∶0X0600,然后跳转到该处执行指令,如图2所示.

图2 读入主引导记录后的内存分布图Fig.2 Memory layout after reading the master boot record

之所以要将主引导记录的代码复制到另一个内存区域(0X0000∶0X0600),是因为从主引导记录找到的可引导分区,可能包含子分区,子分区中仍然可以包含另一个主引导记录,这时就需要将子分区中的子引导记录复制到0X0000∶0X7C00处,直到最终找到的是引导程序(BOOTSTRAP),它就在内存0X0000∶0X7C00处执行.

引导监督程序(BOOT MONITOR)程序主要完成的工作有决定内存的布局、CPU的型号和当前的显示模式等.引导监督程序也用来设置内核映像加载之前的环境参数,最后引导监督程序将内核映像(BOOTIMAGE)读入内存,并且将CPU控制权交给它.此时,操作系统需要做一些初始化的工作,BOOTIMAGE程序在执行之后,会调用其中的boothead.s程序将CPU切换到保护模式,之后会调用MPX386.S文件中设置全局描述符表、局部描述符表及中断描述符表等,具体的流程如图3所示.

图3 操作系统初始化图Fig.3 Initialization of the MINIX3 operating system

4 结 语

MINIX操作系统是一个不断发展和完善的操作系统,它采用了微内核的系统架构,与传统的宏内核的操作系统相比,微内核操作系统的设计目标是提供高可靠性、安全和可扩展的平台.MINIX3操作系统的内核非常小,便于人们研究,微内核架构的操作系统也是目前操作系统研究领域的一个热点.

参考文献:

[1] Andrew S T,Albert S.Operating Systems:Design and Implementation[M].北京:清华大学出版社,2008.

[2] Le V J,Uhlig V,Stoess J, et al.Unmodified device driver reuse and improved system dependability via virtual machines[J].Proc 6th Symp on Operating Systems Design and Implementation,2004(6):17-30.

[3] Andrew S T,Jorrit N, Herder,et al.Can We Make Operating Systems Reliable and Secure[M].Amsterdam:Vrije Universiteit,2006.

[4] Andrew S.Boot sequence Overview[EB/OL].http://www.os-forum.com/minix/boot/bootsequence.

猜你喜欢

驱动程序内核进程
强化『高新』内核 打造农业『硅谷』
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
计算机硬件设备驱动程序分析
微生物内核 生态型农资
社会进程中的新闻学探寻
基于MPC8280的CPU单元与内部总线驱动程序设计
俄罗斯现代化进程的阻碍