Minix3源码分析(1)——系统架构

我们知道,操作系统内核的实现一般有两种架构:宏内核和微内核

宏内核:将操作系统所提供的所有服务功能都放在一起,形成一个庞大的可执行文件。
微内核:内核只提供最基本的消息中转功能,将其余的各种服务功能(文件系统、进程管理器、设备驱动程序等)分离出去,由一般的用户进程来实现,只留下一个最小的内核。

linux不同,minix3正是基于微内核架构,这种设计使得minix3的结构更加模块化和灵活,内核出现的问题可以被快速找到,大大提升了系统的可靠性。

minix3整体采用客户-服务器模型,这与其微内核的架构是相通的。

如上图所示,内核的全部工作就是处理客户与服务器间的通信。由于所有的服务器都是以用户进程的形式运行的,而不是运行在内核态,所以它们不能直接访问硬件。这样处理的好处是,假如在文件服务器中发生了错误,那么文件服务可能会崩溃,但不会导致整个系统崩溃。

在实际的系统中,内核并不只是处理客户与服务器之间的消息传递,这是因为有些操作系统功能(如向物理I/O设备写入命令字)靠用户空间的程序是很难完成的。解决这个问题的方法有两种:

1. 建立一些运行于内核态的专有服务器进程(如I/O设备驱动程序),它们能访问所有的硬件设备,但仍然通过平常的消息机制与其他进程通信。
2.机制与策略分离。 即在内核中建立一套最小的机制,而将策略留给用户空间中的服务器进程。

早期的minix采用第一种方法。即驱动程序被编译进内核,但是作为一个单独的进程运行。

而在minix3中,则采用第二种方法。驱动程序运行在用户空间,然后通过特殊的内核调用来请求读、写I/O寄存器,或是访问内核信息。例如,内核可能将发往某个特定地址的消息理解为:取出该消息的内容,并将其装入某个磁盘的I/O设备寄存器,从而启动一次读盘操作。在这个例子中,内核甚至不对消息的内容进行合法性检查,而只是将它们机械性地复制到磁盘设备寄存器中(显然,必须使用某种方案将此类消息的发送限定在一些授权的进程中)。


minix3被组织成四层,每一层执行一套定义明确的功能。

内核最底层进行进程调度,并负责进程在就绪态、运行态和阻塞态之间的转换。内核还负责处理所有进程间的消息。消息处理需要核实目标的合法性,定位内存中的发送和接收缓存,并把消息从发送缓存复制到接收缓存。内核的另一部分支持对I/O端口和中断的访问,在现代处理器中这需要使用特权内核模式指令,这些指令在用户进程中是没有的。

第1层的主要功能是为上层驱动程序和服务器提供一组特权内核调用。包括读写I/O端口、跨地址空间复制数据等。这些调用由系统任务实现。尽管系统任务和时钟任务被编译进了内核地址空间,但它们作为单独的进程调用,并拥有自己的调用堆栈。

内核以上的其他三层也可以视为一层,因为内核从根本上同样对待它们。每一层只限于使用用户模式指令,并且每一层由内核调度执行。它们都不能直接对I/O端口进行操作。此外,它们也不能访问分配给它们之外的内存。
第2、第3和第4层真正的不同之处在于进程都潜在具有一定的特权。第2层中的进程拥有最多的特权,第3层中的进程拥有较少的特权,而第4层的进程则没有特权。

第2层都是设备驱动程序,用于请求系统任务代表它们从I/O端口读写数据。

第3层则是服务器进程,即向用户进程提供有用服务的进程。进程管理器文件系统这两个服务器是必不可少的。前者执行所有涉及启动或终止进程、与信号有关的系统调用,除此之外,它还负责管理内存。后者负责执行文件系统的调用。

内核调用和系统调用的区别在于:

内核调用:由系统提供的以使驱动程序和服务器完成工作的底层函数,它们不能由用户进程调用。
系统调用:由POSIX规范定义的高层用户接口,以供用户进程使用。

实现这些调用的机制是相似的,并且内核调用可以视为系统调用的一个子集。

第3层中除进程管理器和文件系统以外,还有其他一些服务,它们执行minix3特定的功能。信息服务器负责提供其他驱动程序和服务器的调试和状态信息的工作,这在像minix3这样专门为实验而设计的系统中是非常重要的。再生服务器启动或重启那些不与内核一起加载到内存中的设备驱动程序。另外,如果驱动程序在操作过程中失败,它检测到这个失败,并杀死这个驱动程序(如果它没有死的话),并且重启一个驱动程序的新的副本,从而使整个系统拥有更好的容错能力。在一个网络操作系统中,第3层中还可能有网络服务器服务器不能直接进行I/O操作,但它们可以通过驱动程序来请求I/O。服务器也可以通过系统任务与内核通信。

第2层和第3层中的驱动程序和服务器通常被称为系统进程。大部分系统进程会在系统第一个用户登录前启动,并且它们拥有比用户进程更高的优先级。

第4层包括了所有的用户进程。如shell程序、编辑器、编译器和调试器等。许多用户进程随着用户的登录、工作和退出而创建和终止。但通常还有一些进程在系统引导时启动,并一直运行,如init进程。这些进程都被称为守护进程守护进程是周期性运行或总是等待某个事件(如网络上一个包的到达)的后台进程。从某种意义上来说,守护进程是单独启动并作为一个用户进程来运行的服务器。

minix3中,有必要区分一下任务设备驱动程序

任务:专指时钟任务或系统任务。
设备驱动程序:指其他运行在用户空间的设备驱动程序。

猜你喜欢

转载自blog.csdn.net/qq_41145192/article/details/82503772