Linux内核有五大核心子系统,分别是进程调度系统、虚拟文件系统(VFS)、内存管理单元(MMU)、网络单元、进程间通信(IPC)。
在Linux内核中的主要组件中,五个核心子系统是最为重要的组成部分,它与系统调用接口(System Call Interface)、以及Arch层组成了整个Linux的内核的框架。
其中,System Call Interface(SCI)提供从用户空间到内核空间执行接口调用的方法,该接口可以依赖于体系结构,即使在同一处理器系列中也是如此。可以在 ./linux/kernel 中找到 SCI 的实现,与体系结构相关的部分在 ./linux/arch 中。
1、进程调度系统
此内核子系统负责为在系统上同时运行的所有进程之间公平地分配CPU时间,是Linux内核最重要的子系统。
进程管理的重点是进程的执行。在内核中,这被称为线程,代表处理器的单独虚拟化(线程代码、数据、堆栈和 CPU 寄存器)。在用户空间中,通常使用术语“进程”,但Linux实现并未区分这两个概念(进程和线程)。内核通过 SCI 提供应用程序接口(API)来创建新进程(fork、exec 或可移植操作系统接口POSIX函数)、停止进程(kill、exit)以及它们之间的通信和同步机制(信号或 POSIX 机制)。
在进程管理中,需要在活动线程之间共享 CPU。内核实现了一种新的调度算法,无论有多少线程争夺CPU,该算法都以恒定的时间运行,这被称为 O(1) 调度程序,表示调度一个线程与调度多个线程所花费的时间相同。 O(1) 调度程序还支持多个处理器(称为对称多处理或 SMP)。(可以在 /linux/kernel中找到进程管理源代码,在/linux/arch目录中可找到与体系结构相关的源代码。)
2、虚拟文件系统
该子系统负责提供统一的接口,以访问跨不同文件系统和物理存储介质的存储数据。
虚拟文件系统(VFS)是 Linux 内核的一个有趣的方面,因为它为文件系统提供了通用的接口抽象。 VFS 在 SCI 和内核支持的文件系统之间提供了一个交换层(参见下图)。
![VFS 提供用户和文件系统之间的交换结构]
VFS 的顶部是诸如打开、关闭、读取和写入等功能的通用 API 抽象。 VFS的底层是文件系统抽象,定义了上层功能的实现方式。这些是给定文件系统的插件(现在有50多个)。可以在./linux/fs 中找到文件系统源码。
文件系统层下面是高速缓冲区,它为文件系统层提供一组通用的功能(独立于任何特定的文件系统)。该缓存层通过短时间保留数据(或推测性地预读,以便在需要时提供数据)来优化对物理设备的访问。高速缓冲区下方是设备驱动程序,它们实现特定物理设备的接口。
关于设备驱动程序,Linux 内核中的绝大多数源代码都存在于使特定硬件设备可用的设备驱动程序中。 Linux 源代码树提供了一个驱动程序子目录,该子目录按支持的各种设备(例如蓝牙、I2C、串行等)进一步划分。可以在./linux/drivers 中找到设备驱动程序源。
3、内存管理单元
该内核子单元负责在系统上运行的各种进程之间正确分配内存资源。它不仅仅是为每个进程提供单独的虚拟地址空间。
内存是Linux内核管理的重要资源。为了提高效率,考虑到硬件管理虚拟内存的方式,内存是在所谓的页中管理的(大多数体系结构的大小为4KB)。Linux内核提供了管理可用内存的方法,以及物理和虚拟映射的硬件机制。
但是内存管理远不止管理4KB缓冲区。Linux在提供了超过4KB缓冲区的虚拟内存,例如slab分配器。此内存管理方案使用4KB缓冲区作为其基础,但随后从内部分配结构,跟踪哪些页已满、哪些部分使用和哪些已经为空。这使得该方案可以根据更大的系统需求动态增长和减小内存。
支持多个用户的内存,有时会出现可用内存耗尽的情况。因此,页可以从内存中移出到磁盘上。这个过程被称为交换,可以在Linux内核源码的/linux/mm目录下找到内存管理源代码。
4、 网络单元
该单元允许Linux系统通过网络连接到其他系统。它支持许多可能的硬件设备,以及许多可以使用的网络协议。网络子系统抽象了这两个实现细节,以便用户进程和其他内核子系统可以访问网络,而不必知道正在使用的物理设备或协议。
根据设计,网络堆栈遵循以协议本身为模型的分层架构。回想一下,互联网协议(IP)是位于传输协议(最常见的是传输控制协议或TCP)之下的核心网络层协议。TCP之上是套接字层,通过SCI调用。
套接字层是网络子系统的标准 API,并为各种网络协议提供用户界面。从原始帧访问到 IP 协议数据单元 (PDU),再到 TCP 和用户数据报协议 (UDP),套接字层提供了一种标准化方法,来管理连接和在端点之间移动数据。可以在内核中的 ./linux/net 中找到网络源码。
5、进程间通信
该单元实现进程间的相互通信,并与内核通信,以协调其活动。Linux支持许多进程间通信(IPC)机制,信号和管道是其中的两个,Linux也支持以Unix TM版本命名的System V IPC机制。