Linux内核--内核基础知识

第一章 内核基础知识

一、概述

  1. 内核版本号

    内核的版本号主要有四个数组组成。比如版本号:2.6.26.1 其中,

    2 — 主版本号

    6 — 从版本号或副版本号

    26 — 修订版本号

    1 — 稳定版本号

    副版本号表示这个版本是稳定版(偶数)还是开发版(奇数),上面例子中的版本号是稳定版。

    稳定的版本可用于企业级环境。

    修订版本号的升级包括BUG修正,新的驱动以及新的特性的追加。

    稳定版本号主要是一些关键性BUG的修改。

  2. 单内核与微内核

  • 单内核

    • 原理

      整个内核都在一个大内核地址空间上运行。

    • 优势

      1. 简单。

      2. 高效:所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销

    • 劣势

      一个功能的崩溃会导致整个内核无法使用。

  • 微内核

    • 原理

      内核按照功能被划分成各个独立的过程。每个过程独立运行在自己的地址空间上。

    • 优势

      1. 安全:内核的各种服务独立运行,一种服务挂了不会影响其他服务
    • 劣势

      内核各个服务之间的调用设计进程间的通信,比较复杂且效率低。

    Linux内核虽是基于单内核的,但是经过这么多年的发展,也具备微内核的一些特性。(这也体现了Linux实用至上的原则)

  1. 可重入内核

    所有的Unix内核都是可重入内核,所谓的可重入内核意味着有几个进程可以同时在内核态下执行。当然,在单核处理器下面只有一个进程在真正运行。但是许多进程可以在内核态下被阻塞,或等待CPU,或等待一些I/O操作。

    例如内核代表当前进程发布一个读磁盘的请求后,就让磁盘处理该请求,并将会部分其他进程的执行。当设备满足了请求时,一个中断就会通知内核去执行原来的进程,原来的进程就恢复执行。

    系统可重入的一种方式是编写函数,以便这些函数值修改局部变量,而不能修改全局数据结构,这样的函数就叫可重入函数。但是可重入内核不仅仅局限于这样的可重入函数。内核可以包含非重入函数,并且利用锁机制保证一次只有一个进程执行一个非重入函数。处于内核态的每个进程只能作用于自己的内存空间,不能干预其他的进程。

    发生硬件中断时,可重入内核能挂起当前正在执行的进程,即使这个进程处于内核态。这种能力是非常重要的,因为这能提高发出终端的设备控制器的吞吐量。一旦设备发出一个中断,它一直等到CPU应答它为止。如果内核能够快速应答,在CPU处理终端时候设备控制器将能执行其他任务。

    下面来看一下内核的可冲入量对内核组织的影响。

    内核控制路径(kernel control path)表示由内核执行的指令序列,从来处理系统调用、异常及中断。

  2. 进程地址空间

    每个进程运行在它私有的地址空间。在用户态下运行的进程涉及到私有栈、数据和代码区。当内核态运行时,进程访问内核的数据和代码区,但是用另外的栈。

    因为内核是可重入的,几个内核控制帧路径(每个进程与不同的进程相关)可以轮流执行。在这种情况下,每个内核控制路径都有他自己的私有内核态堆栈。

  3. 同步和临界区

    实现可重入内核需要利用同步机制:如果作用于内核数据结构的内核控制帧路径被挂起,那么,其他的内核控制路径就不能再作用于该数据结构,除非它已被重新设置成一个一致性状态。否则两个控制路径的交互作用将被破坏所存储的信息。

    也就是说当两个进程访问同一个数据结构时应该保持一致性。

  4. 非抢占式内核

    当进程在内核态执行时,它不能被任意挂起,也不能被挂起,也不能被另一个进程代替。因此,在单个处理器系统上,所有中断异常处理程序不能更新的内核数据结构,内核对它们的访问都将是安全的。

    非抢占式内核是低效的,因为运行在不同的CPU的两个内核控制路径本可以并发的访问相同的数据结构。

  5. 自旋锁机制

    单处理器系统上的另一种机制是:在进入一个临界区之前禁止产生所有的硬件中断。

  6. 交换与高速缓存

    为了扩充进程所用的虚拟地址空间的大小,Unix操作系统使用磁盘上的交换区域。虚拟内存系统以一个页框的内容作为交换的基本单位。当一些进程引用已经换出页时。MMU产生一个异常,然后异常处理长须分配一个新的页框,并用存储在磁盘在从磁盘上的旧内容初始化该页框。

    另一方面,物理内存也被用作磁盘和其他块设备的高速缓存。这是因为硬盘非常慢,磁盘的访问需要几毫秒,与RAM的访问时间相比,这就相当漫长了。因此,磁盘通常是英系那个系统性能的瓶颈。作为一般规则,在最早的Unix系统就已经实现的一个策略是:通过把把从磁盘独处的块转入到RAM的一组磁盘缓冲区中来尽可能地推迟写磁盘的时间。sync()系统调用把所有“脏”的缓冲区(即缓冲区的内容与对应磁盘块的内容不一样)写入磁盘来使得磁盘同步。为了避免数据丢失,所有的操作系统都会注意会周期性地把脏缓冲写回磁盘。

  7. 设备驱动程序

    设备通过设备驱动程序(device sriver)与I/O设备打交道。设备驱动程序包含在内核中,由控制一个或多个设备的数据结构和函数组成,这些设备包括硬盘、键盘、鼠标、监视器、网络接口以及连接到SCCI总线上的设备。通过特定的接口,每个驱动程序与内核中的其余部分(甚至与其他驱动程序)相互作用,这个方式具有以下优点:

    • 可以把特定的代码封装在特定的模块中。
    • 厂商不动内核源代码,只遵守接口规范,就能增加新的设备。
    • 内核以统一的方式对待所有的设备,并且通过相同的接口访问这些设备。
    • 可以把设备驱动程序写成模块,并且通过相同的接口访问这些设备。
    • 可以把设备驱动程序写成模块,并动态地把它们装进内核,不需要重新启动系统。不需要时,也可以卸载模块,以减少存储在RAM中内核的大小。

    操作文件调用关系如图所示,其中P代表了利用常用的与文件相关的系统调用及在/dev目录下能找到的文件向内核发出请求。实际上,设备文件是设备驱动程序接口中用户可见的部分。每个设备文件都有专门的设备驱动程序,他们有内核调用以执行对硬件设备的请求操作。

Linux内核--内核基础知识_第1张图片

  1. 段寄存器

    为了方便快速找到段选择符,处理器提供段寄存器,且目的是存放段选择符。这些段寄存器称为:CS、SS、DS、ES、FS和GS。尽管只有6个段寄存器,且程序可以把同一个段寄存器用于不同的目的,方法是先将其值保存在内存中,用完后再恢复。

    六个寄存器中三个有专门用途:

    CS:代码段寄存器,指向存放程序指令的段。

    SS:栈段寄存器,指向存放当前程序栈的段。

    DS:数据段寄存器,指向存放静态数据或者外部数据的段。

    其他三个段寄存器作一般用途,可以用来访问任意的段。

    CS寄存器还有一个很重要的功能:它含有一个两位的域,用以指明CPU的当前特权级(Current Privilege Level,CPL)。值为0代表最高级,而值为3代表最低级。Linux只用0~3级,分别称之为内核态和用户态。

参考书籍:《深入理解Linux内核》

你可能感兴趣的:(Linux,kernel)