Linux Kernel 概览

徐小东

2023-01-03

Kernel 的任务

内核是硬件与软件之间的一个中间层。作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。

Kernel 架构类型

Kernel 架构类型

Kernel 架构类型

Linux kernel 简介

Linux kernel 是自由开源、单体、模块化、多任务、类 Unix 的操作系统内核。

Linux kernel 代码行数

Linux kernel 代码行数

Linux Kernel 的组成部分

Kernel 的组成部分

Kernel 的组成部分

进程管理和调度

问题

  1. 如何共享 CPU 时间:内核必须决定为各个进程分配多长时间
  2. 如何在进程之间切换:何时切换到下一个进程,哪个进程是下一个

这两个任务是称之为调度器的内核子系统的职责。

解决方案

抢占式多任务处理(preemptive multitasking),各个进程都分配到一定的时间段执行,但重要的进程会比次要的得到更多的 CPU 时间。

进程执行模型

进程生命周期

进程优先级

进程调度器

CFS 调度器

CFS 调度器

所有的可运行进程都按时间在一个红黑树中排序,所谓时间即其等待时间。等待 CPU 时间最长的进程是最左侧的项,调度器下一次会考虑该进程。等待时间稍短的进程在该树上从左至右排序。

内存管理

从进程的角度来看,Linux 将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间。

虚拟地址空间

虚拟地址空间

大多数情况下,单个虚拟地址空间就比系统中可用的物理内存要大。内核和 CPU 必须考虑如何将实际可用的物理内存映射到虚拟地址空间的区域。

虚拟和物理地址

虚拟和物理地址

可取的方法是用页表来为物理地址分配虚拟地址。虚拟地址关系到进程的用户空间和内核空间,而物理地址则用来寻址实际可用的内存。

分配虚拟地址

分配虚拟地址

多级分页:为减少页表的大小并容许忽略不需要的区域,计算机体系结构的设计会将虚拟地址划分为多个部分。

伙伴系统

伙伴系统

伙伴系统:快速检测内存中的连续区域,供内核分配连续页。

slab 分配器

slab 分配器

slab 缓存:分配比页帧小的内存块,并缓存频繁使用的小对象。

I/O

内核必须处理 3 方面的问题:

  1. 必须根据具体的设备类型和模型,使用各种方法对硬件寻址。
  2. 内核必须向用户应用程序和系统工具提供访问各种设备的方法。
  3. 用户空间需要知道内核中有哪些设备可用。
外设寻址的分层模型

外设寻址的分层模型

内核与外设通信的方法:

设备文件:用于访问扩展设备,这些文件建立了与某个设备驱动程序的连接,以支持与扩展设备的通信。

I/O 调度:内核采用的各种用于调度和重排 I/O 操作的算法,称之为 I/O 调度器。

虚拟文件系统:为支持各种本机文件系统,且同时允许访问其他操作系统的文件,Linux 内核在用户进程(或 C 标准库)和文件系统实现之间引入了一个抽象层。该抽象层称之为虚拟文件系统(Virtual File System),简称 VFS。

Ext 文件系统族:Ext2/3/4

硬盘上的启动扇区和块组

硬盘上的启动扇区和块组

每个文件系统都由大量块组组成,在硬盘上相继排布。

Ext2 文件系统的块组

Ext2 文件系统的块组

块组是 Ext2 文件系统的核心要素。

Ext3:提供了一种日志(journal)特性,记录了对文件系统数据所进行的操作。在发生系统崩溃之后,该机制有助于缩短 fsck 的运行时间。

Ext4:大型文件系统(单文件最大支持 16 TiB,卷最大支持 1 EiB)、持久预分配、日志校验和、透明加密等。

网络

问题

从程序员的视角来看,程序如何访问网络功能?

解决方案

网卡的运作方式与普通的块设备和字符设备完全不同,使得经典的 UNIX 箴言“万物皆文件”不再完全适用。

将一种称为套接字的特殊结构用作到网络实现的接口,这种方案现在已经成为工业标准。

内核中分层模型的实现

内核中分层模型的实现

内核网络子系统的实现与 TCP/IP 参考模型非常相似。

系统调用

系统调用用于从用户应用程序调用内核例程,以利用内核的一些专门的功能。