Linux Kernel 3
Linux 内核概览(Overview of the Linux Kernel)
一、Linux 的开发模式(Linux Development Model)
Linux 内核是世界上最大规模的开源项目之一:
- 拥有数千名开发者参与;
- 每个版本发布时有上百万行代码被新增、修改或删除。
📜 授权协议:GPLv2
Linux 以 GPLv2 \text{GPLv2} GPLv2(GNU General Public License v2)授权发布。
🔒 核心条款:
若某公司对内核进行修改,并将该软件销售或交付给客户,则这些修改后的源代码必须提供给客户。
虽然法律上只要求提供给客户,实际上大多数公司都会将修改后的内核源代码公开发布,以维护社区贡献和合规性。
二、开发者结构与参与者
Linux 内核的开发者包括:
- 各大公司(即使彼此竞争,也一起维护内核)
- 学术机构
- 独立开发者与爱好者
Linux 社区具有高度开放性和协作性。
三、固定周期发布模型(Release Model)
当前 Linux 内核采用固定发布周期:
- 每 3~4 个月发布一个正式版本;
- 新功能通过Merge Window合并窗口并入主线。
发布流程:
-
合并窗口(Merge Window):
- 持续 1~2 周;
- 集中合并新功能和改动。
-
候选版本(Release Candidate, RC):
- 每周发布一次,命名为
rc1
、rc2
等; - 进入测试与修复阶段。
- 每周发布一次,命名为
四、维护者层级体系(Maintainer Hierarchy)
为了支撑如此庞大的开发量,Linux 内核采用分层的维护者模型:
1. Linus Torvalds
- Linux 之父,也是内核主维护者;
- 主要职责是:从各子系统维护者那里合并 Pull Request。
2. 子系统维护者(Subsystem Maintainers)
- 每个子系统(如网络、文件系统、内存管理等)由一位或多位维护者负责;
- 他们从开发者或驱动作者处接受 patch 或 Pull Request。
3. 各自的 Git 树(Git Tree)
每个维护者都有自己的 Git 仓库,例如:
- Linus Torvalds:
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
- David Miller(网络子系统):
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/
五、-next 树与合并策略(-next Trees)
因为合并窗口只有两周,大多数子系统维护者会建立一个 -next 树:
- 该树用于接收下一轮合并窗口的功能补丁;
- 即使主线 Merge Window 关闭,开发者仍可以提交补丁到 -next 分支;
- 当新的合并窗口开启时,再由子系统维护者提交到 Linus 主线。
六、错误修复的特殊处理(Bug Fixes)
- Bug 修复(特别是回归 bug 和安全问题)不受 Merge Window 限制;
- 维护者可以在任何时间将修复补丁合并进自己的维护树;
- Linus 会在每个 RC 阶段定期从各子系统维护者处 pull 这些修复。
💡 Linux 的开发方式体现了模块化、分层协作和开放治理,是大型开源项目协作的典范。
Linux 源码顶层目录结构概览(Top-Level Linux Source Code Folders)
📁 arch
- 含义:架构相关代码(Architecture-specific code)
- 每种 CPU 架构(如 x86 \text{x86} x86、 arm \text{arm} arm、 arm64 \text{arm64} arm64)都有独立子目录;
- 包括启动流程、异常处理、汇编支持、MMU 初始化等平台特定实现。
📁 block
- 含义:块设备子系统代码(Block Subsystem)
- 管理块设备(如硬盘、SSD)读写流程:
- 创建 I/O 请求
- 请求合并与调度(支持多种调度器,如 CFQ , Deadline , BFQ \text{CFQ}, \text{Deadline}, \text{BFQ} CFQ,Deadline,BFQ)
- 下发至底层设备驱动
📌 块设备(Block Device):按“块”进行读写的设备,如磁盘,不同于按字节流工作的字符设备(如串口)。
📁 certs
- 含义:证书验证支持模块
- 实现数字签名校验逻辑;
- 用于模块加载签名验证等内核安全机制。
📁 crypto
- 含义:加密算法实现
- 包含:
- 各类软件加密算法(如 AES、SHA)
- 一个可扩展框架:支持将加密操作卸载到硬件加速器
📁 Documentation
- 含义:内核文档
- 内容包括:
- 各子系统设计说明
- 命令行参数参考
- sysfs 文件格式说明
- 设备树绑定(Device Tree Bindings)文档
📁 drivers
- 含义:设备驱动实现
- 涵盖各种设备驱动代码;
- 实现 Linux 驱动模型(Driver Model):抽象描述设备、驱动、总线和它们之间的连接方式。
📁 firmware
- 含义:设备固件文件
- 包含以二进制或十六进制形式存储的固件;
- 供驱动加载(如 Wi-Fi、GPU 固件等)。
📁 fs
- 含义:文件系统模块
- 包含:
- 通用虚拟文件系统( VFS, Virtual Filesystem Switch \text{VFS, Virtual Filesystem Switch} VFS, Virtual Filesystem Switch)
- 各种实际文件系统的驱动(如 ext4 \text{ext4} ext4、 btrfs \text{btrfs} btrfs、 fat \text{fat} fat)
📁 include
- 含义:头文件目录
- 存放内核各模块的公共和私有头文件;
- 是整个编译系统的核心依赖之一。
📁 init
- 含义:通用启动初始化代码
- 执行系统启动阶段的初始化逻辑(非架构专属);
- 包括 init 进程初始化、命令行解析等。
📁 ipc
- 含义:进程间通信机制实现(Inter Process Communication)
- 提供:
- 消息队列(message queue)
- 信号量(semaphores)
- 共享内存(shared memory)
📁 kernel
- 含义:内核核心代码
- 包括:
- 进程管理
- 内核线程、工作队列( workqueue \text{workqueue} workqueue)
- 调度器(Scheduler)
- 时间管理、IRQ 中断处理、锁机制等
📁 lib
- 含义:通用库函数
- 提供:
- 排序、校验和、压缩/解压缩
- 位图处理、数学函数、哈希表等通用逻辑
📁 mm
- 含义:内存管理(Memory Management)
- 涵盖:
- 物理内存与虚拟内存的管理
- 分配器(如 SLAB \text{SLAB} SLAB、 SLUB \text{SLUB} SLUB、 CMA \text{CMA} CMA)
- 分页机制、交换(swap)、虚拟地址映射等
📁 net
- 含义:网络协议栈实现
- 包括:
- IPv4 / IPv6 协议
- BSD socket 实现
- 路由、包调度、网桥、流控等模块
📁 samples
- 含义:示例代码
- 提供设备驱动或子系统的示例实现,方便开发者参考。
📁 scripts
- 含义:构建与工具脚本
- 包括:
- 内核模块构建脚本
- kconfig \text{kconfig} kconfig 配置系统
- 检查补丁风格的脚本(如
checkpatch.pl
)
📁 security
- 含义:Linux 安全模块框架(LSM)
- 实现:
- 安全扩展模块,如 SELinux , AppArmor , Smack , Tomoyo \text{SELinux}, \text{AppArmor}, \text{Smack}, \text{Tomoyo} SELinux,AppArmor,Smack,Tomoyo
- 基于钩子的访问控制机制
📁 sound
- 含义:音频系统支持
- 包括:
- ALSA \text{ALSA} ALSA(Advanced Linux Sound Architecture,高级音频框架)
- 旧的 OSS \text{OSS} OSS(Open Sound System)
📁 tools
- 含义:用户态工具集
- 提供用于测试、调试或与内核子系统交互的工具程序(如
perf
,bpf
工具等)
📁 usr
- 含义:内嵌 initrd 支持
- 支持将
initrd
初始根文件系统嵌入进内核镜像中。
📁 virt
- 含义:KVM 虚拟化子系统
- 包含 KVM \text{KVM} KVM(Kernel-based Virtual Machine)的核心代码;
- 提供对硬件虚拟化支持(Intel VT、AMD-V 等)。
Linux 内核核心子系统详解(详细概览)
📁 arch - 架构相关代码(Architecture Specific Code)
该目录包含与特定 CPU 架构(如x86、ARM、MIPS等)相关的实现:
- 可进一步细分为机器特定代码(machine specific code),例如针对特定主板或 SoC 的支持;
- 包含与启动加载器(boot loader)的接口,以及架构初始化流程;
- 提供对架构特定硬件的访问接口,包括:
- 中断控制器(interrupt controller)
- 多核处理控制器(SMP controllers)
- 总线控制器(BUS controllers)
- 异常与中断初始化(exceptions & interrupt setup)
- 虚拟内存处理(virtual memory handling)
此外还实现了架构优化函数(例如 m e m c p y memcpy memcpy、字符串操作等)。
🏗️ Linux 最初是在 32 32 32位的 x 86 x86 x86(386及以上)架构上开发的。如今支持的架构包括(但不限于):
- Compaq Alpha AXP、Sun SPARC、Motorola 68000、PowerPC、ARM、IBM S/390、MIPS、IA-64、AMD x86-64等
📁 drivers - 设备驱动
Linux 内核使用统一的设备模型(device model),用于维护反映系统当前状态的数据结构,包括:
- 当前存在哪些设备
- 它们连接在哪个总线上
- 它们关联到哪个驱动程序
- 当前状态是否活动
这些信息对于实现系统电源管理、设备热插拔、设备发现与移除等功能至关重要。
每个子系统都有特定的驱动接口,针对其代表的设备类型设计,以简化驱动编写并减少重复代码。
支持的设备类型极其广泛,包括:
- TTY、串口(serial)、SCSI、文件系统、以太网、USB、帧缓冲(framebuffer)、输入设备、音频等
👤 进程管理(Process Management)
Linux 实现了标准 Unix 风格的进程管理接口:
- f o r k ( ) fork() fork():创建子进程
- e x e c ( ) exec() exec():替换当前进程映像
- w a i t ( ) wait() wait():等待子进程结束
- POSIX 线程支持(pthreads)
但与其他操作系统不同:
- 内核没有分开的“进程”或“线程”结构;
- 所有任务都用一个统一的数据结构描述: s t r u c t t a s k _ s t r u c t struct\ task\_struct struct task_struct,代表一种抽象的调度单元(task)。
每个任务包含指向各种资源的指针,如:
- 地址空间(address space)
- 文件描述符(file descriptors)
- IPC 资源(信号量、消息队列、共享内存等)
同一个进程中的多个任务共享资源指针;
不同进程的任务拥有独立资源指针。
这种抽象模型,加上 c l o n e ( ) clone() clone()与 u n s h a r e ( ) unshare() unshare()系统调用,支持构建如**命名空间(namespace)**这类先进特性。
✳️ 命名空间(Namespace)
用于对进程视图进行隔离(如文件系统、PID、网络栈等),配合控制组 c g r o u p cgroup cgroup实现 Linux 容器化(操作系统级虚拟化)。
✳️ 控制组(cgroup)
允许将进程分层管理,并按照配置规则对系统资源(如CPU、内存、IO)进行分配。
🧠 内存管理(Memory Management)
Linux 的内存管理子系统非常复杂,主要包括:
1. 物理内存管理(Physical Memory)
- 分配与释放实际 RAM 空间
- 页帧管理(page allocator)
2. 虚拟内存管理(Virtual Memory)
- 分页机制(paging)
- 交换空间(swapping)
- 按需加载(demand paging)
- 写时复制(Copy-on-write)
3. 用户服务接口
- 管理用户空间内存: m m a p ( ) mmap() mmap()、 b r k ( ) brk() brk()、共享内存( s h m shm shm)
4. 内核服务接口
- 内核分配器: S L A B SLAB SLAB/ S L U B SLUB SLUB/ S L O B SLOB SLOB 等
- 虚拟分配接口: v m a l l o c vmalloc vmalloc、高端内存管理等
💽 块 I/O 管理(Block I/O Management)
Linux 的块 I/O 子系统处理与块设备(如硬盘、SSD)的读写操作,工作流程包括:
- 创建块 I/O 请求(block I/O requests)
- 请求重组与转换(如用于软件 RAID、LVM)
- 请求合并与排序
- 通过多个 I/O 调度器调度请求并下发给块设备驱动程序
常见的调度器包括 n o o p noop noop、 d e a d l i n e deadline deadline、 c f q cfq cfq、 b f q bfq bfq等
虚拟文件系统开关(VFS:Virtual Filesystem Switch)
Linux 的 VFS(Virtual Filesystem Switch)实现了一套通用/抽象的文件系统接口,用于简化和统一各种实际文件系统驱动的开发,避免代码重复。
VFS 引入了多个关键数据结构,用于抽象表示文件系统内部的各个组成部分:
📂 核心结构体(文件系统抽象)
-
i n o d e inode inode:表示磁盘上的文件本体,包括:
- 文件属性(如权限、大小、创建时间等)
- 数据块在磁盘上的位置
-
d e n t r y dentry dentry(目录项):将 i n o d e inode inode与一个文件名 目录结构中的路径关联起来;
- 例如:路径 " / h o m e / u s e r / f i l e . t x t " "/home/user/file.txt" "/home/user/file.txt"对应某个 i n o d e inode inode的 d e n t r y dentry dentry条目
-
f i l e file file:表示一个打开的文件,包含文件状态信息:
- 如当前文件偏移(file pointer)
- 访问权限、标志等
-
s u p e r b l o c k superblock superblock:描述整个已格式化的文件系统的元信息,包括:
- 总块数(number of blocks)
- 块大小(block size)
- 根目录所在磁盘位置
- 是否启用加密等信息
🧠 缓存机制(Caching in VFS)
为了提高文件系统性能,VFS 实现了一套多层缓存机制:
1. i n o d e inode inode 缓存
- 缓存文件属性与内部元信息(metadata)
- 减少对磁盘的频繁访问
2. d e n t r y dentry dentry 缓存
- 缓存目录结构(路径信息),加快路径解析(path lookup)
3. 页面缓存( p a g e page page cache)
- 缓存文件内容(数据块);
- 数据读写操作优先走内存,提升性能,避免频繁读写磁盘
Linux 安全模块(LSM:Linux Security Modules)
Linux 安全模块(LSM)是一套钩子机制(hook mechanism),用于扩展默认的 Unix 权限模型,支持各种安全框架。
LSM 的主要功能是:允许内核在敏感操作(如访问文件、创建进程)前后插入自定义的安全检查逻辑。
🔒 已集成的主要安全模块(基于 LSM)
- SELinux(Security-Enhanced Linux):基于强制访问控制(MAC)的安全模块
- AppArmor:基于配置文件路径规则的 MAC 实现
- Tomoyo:可视化策略定义系统,强调人类可读性
- Smack(Simplified Mandatory Access Control Kernel):简化的 MAC 模块
📌 通过 LSM,Linux 可以支持企业级强安全隔离、容器安全、最小权限设计等。