Linux Kernel学习002——简介(二)

操作系统和内核简介

操作系统的精确定义没有一个统一的标准。一般而言,操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分。这些部分应该包括内核、设备驱动程序、启动引导程序、命令行SHell或者其他种类的用户界面、基本的文件管理工具和系统工具。系统这个词其实包含了操作系统和所有运行在它之上的应用程序。

用户界面是操作系统的外在表象,内核才是操作系统的内在核心。系统的其他部分必须依靠内核提供的服务,像管理硬件设备、分配系统资源等。通常内核由负责响应中断的中断服务程序,负责管理多个进程共享处理器的调度程序,负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。对于提供保护机制的现代处理器来说,通常处理器至少应提供两种不同的执行模式——用户模式和系统(内核、特权)模式。操作系统和用户程序分别运行在系统模式和用户模式下,彼此独立。操作系统内核拥有收到保护的内存空间和访问硬件设备的所有权限,而用户程序只能在用户模式执行,只能使用部分系统功能。当系统内核运行时,系统以内核模式进入内核空间执行。而一个普通的用户程序执行时,系统将以用户模式进入用户空间执行。

在系统中运行的应用程序通过系统调用(system call)来与内核通信。但是应用程序一般不直接使用系统调用,而是通过库函数(比如glibc)再由库函数通过系统调用完成各种不同的任务。

如下所示:

Linux Kernel学习002——简介(二)_第1张图片
系统调用

当一个应用程序执行一条系统调用时,我们说内核正在代其执行。这时,应用程序被称为通过系统调用在内核空间执行,而内核被称为运行于进程上下文中。

内核还要管理系统的硬件设备。现代的处理器体系结构几乎都提供了中断机制。当硬件设备需要与系统通信时,它首先发出一个异步的中断信号去打断处理器的执行,进而打断内核的执行。每一个中断通常都对应着一个终端号,内核可以通过这个中断号查找相应的中断服务程序,进而使用该程序响应和处理中断。为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速地退出,中断服务程序在一个与所有进程无关的、专门的中断上下文中运行。

处理器在任何指定的时间点上的活动必然为以下三者之一:

Linux Kernel学习002——简介(二)_第2张图片
关系
  • 运行于用户空间,执行用户进程
  • 运行于内核空间,处于进程上下文,代表某个特定的进程执行
  • 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断

Linux内核和传统Unix内核的比较

Unix内核同宗同源,并且提供相同的API,现代的Unix内核在许多设计上都很相似。Unix内核几乎都是一个不可分割的静态可执行库(叫做宏内核或者单内核,monolithic kernel)。也即,它们必须以巨大、单独的可执行块的形式在一个单独的地址空间执行。Unix内核通常需要硬件系统提供的内存管理单元(MMU)以管理内存。这种机制可以加强对内存空间的保护,并保证每个进程都可以运行于不同的虚地址空间上。早期的Linux系统也需要MMU支持,后来的一些特殊版本不依赖与此,这使得它可以运行在一些没有MMU的小型嵌入式系统中(不过目前基本简单的嵌入式系统都具备MMU了)。我们重点关注的是支持MMU的Linux内核。

宏内核(或者叫单内核, monolithic kernel)和微内核(micro kernel)

操作系统内核可以分为两大类:宏内核和微内核(或者还可以再加上混合内核)

宏内核是一种较为简单的设计,所谓宏内核就是将它从整体上作为一个单独的进程来实现,同时也运行在一个单独的地址空间上。因此,宏内核通常以单个二进制文件的形式存放于磁盘中。此时内核间通信的代价是微不足道的,因为处于同一地址空间,可以直接通过调用函数交互。这种模式具有简单和性能高的特点。缺点是内核尺寸较大,崩溃的风险提高,不易于移植。

微内核不是作为一个单独的大进程来实现的,而是被划分为多个独立的进程(被称作服务器)。一些服务器运行在内核空间,大部分运行在用户空间。所有的服务器都保持分离,并且运行在不同的地址空间。服务器通过IPC(进程间通信)发送消息的方式彼此调用服务。微内核的分割模式避免了部分服务器的失效祸及整个内核。但是,IPC机制的开销大于函数条用,而且涉及内核空间与用户空间的上下文切换,因此导致消息传递需要一定的周期。因而微内核的性能不如宏内核。

Linux Kernel学习002——简介(二)_第3张图片
内核

宏内核和微内核的比较

  1. 从理论上来看,微内核的思想更好些,微内核把系统分为各个小的功能块,降低了设计难度,系统的维护与修改也容易,但通信带来的效率损失是个问题。宏内核的功能块之间的耦合度太高造成修改与维护的代价太高,但是效率高性能好。
  2. 宏内核比微内核更老,宏内核的涉及思想出现在20世纪80年代末。
  3. 宏内核用于Unix和Linux。微内核用于QNX,L4以及HURD(GNU的内核)。微内核最早用于Mach(不是Mac OS X),不过之后它就转向了混合内核。至于Minix也不能算是一个纯正的微内核,因为它的设备驱动直接编译作为内核的一部分了。
  4. 宏内核比微内核执行速度更快
  5. 宏内核一般比较庞大,微内核的体积很小。
  6. 在宏内核中,设备驱动驻留在内核空间;微内核中,设备驱动驻留在用户空间。
  7. 由于设备驱动驻留在内核空间,这导致宏内核较微内核更不安全,并且驱动的错误可能导致内核崩溃。
  8. 宏内核使用信号和套接字保障IPC,微内核使用消息队列。
  9. 为宏内核添加新的功能特性意味着重新编译整个内核,而在微内核中可以通过补丁轻松地添加新特性而无需重新编译。

你可能感兴趣的:(Linux Kernel学习002——简介(二))