Linux内核 --- 内核基础知识

第一章 内核基础知识

一、概述

1. 内核版本号

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

2 — 主版本号

6 — 从版本号或副版本号

26 — 修订版本号

1 — 稳定版本号

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

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

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

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

2. 单内核与微内核

  • 单内核

    • 原理

      整个内核都在一个大内核地址空间上运行。
      单内核与微内核相反,因为它们不仅包含CPU、内存和IPC,而且还包含设备驱动程序、文件系统管理和系统服务器调用等内容。单内核更擅长于访问硬件和多任务处理,因为如果一个程序需要从内存或运行中的其他进程中获取信息,那么它就有一条更直接的线路来访问信息,而不需要在队列中等待来完成任务。但是,这可能会导致问题,因为在管理模式下运行的东西越多,如果行为不正常,就会有越多的东西导致系统崩溃。

    • 优势

      1. 简单。
      2. 高效:所有内核都在一个大的地址空间上,所以内核各个功能之间的调用和调用函数类似,几乎没有性能开销
      3. 更直接地访问程序的硬件
      4. 流程之间更容易通信
      5. 如果支持您的设备,它应该不需要额外安装就可以工作
      6. 进程反应更快,因为没有等待处理器时间的队列
    • 劣势

      1. 一个功能的崩溃会导致整个内核无法使用。
      2. 较大安装体积
      3. 较大内存占用
      4. 不太安全,因为所有操作都在管理模式下运行
        在这里插入图片描述
  • 微内核

    • 原理

      内核按照功能被划分成各个独立的过程。每个过程独立运行在自己的地址空间上。
      微内核只管理它必须管理的东西:CPU、内存和IPC。计算机中几乎所有的东西都可以被看作是一个附件,并且可以在用户模式下处理。微内核具有可移植性的优势,因为只要操作系统仍然试图以相同的方式访问硬件,就不必担心您是否更改了视频卡,甚至是操作系统。微内核对内存和安装空间的占用也非常小,而且它们往往更安全,因为只有特定的进程在用户模式下运行,而用户模式不具有管理员模式的高权限。

    • 优势

      1. 安全:内核的各种服务独立运行,一种服务挂了不会影响其他服务
      2. 可移植性
      3. 安装占用空间小
      4. 小内存使用
    • 劣势

      1. 内核各个服务之间的调用设计进程间的通信,比较复杂且效率低。
      2. 通过驱动程序,硬件更加抽象
      3. 硬件可能反应较慢,因为驱动程序处于用户模式
      4. 进程必须在队列中等待才能获得信息
      5. 进程不能在不等待的情况下访问其他进程
        在这里插入图片描述

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

3. 可重入内核

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

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

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

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

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

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

4. 进程地址空间

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

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

5. 同步和临界区

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

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

6. 非抢占式内核

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

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

7. 自旋锁机制

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

8. 交换与高速缓存

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

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

9. 设备驱动程序

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

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

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

在这里插入图片描述

10. 段寄存器

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

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

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

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

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

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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值