目录
[1. Linux开发模式](#1. Linux开发模式)
[2. 维护者层级](#2. 维护者层级)
[3. Linux 源代码布局](#3. Linux 源代码布局)
[4. Linux 内核架构](#4. Linux 内核架构)
[4.1 arch(architecture)](#4.1 arch(architecture))
[4.2 设备驱动](#4.2 设备驱动)
[4.3 进程管理](#4.3 进程管理)
[4.4 内存管理](#4.4 内存管理)
[4.5 块 I/O 管理](#4.5 块 I/O 管理)
[4.6 虚拟文件系统开关(Virtual Filesystem Switch)](#4.6 虚拟文件系统开关(Virtual Filesystem Switch))
[4.7 网络栈](#4.7 网络栈)
[4.8 Linux 安全模块](#4.8 Linux 安全模块)
1. Linux开发模式
Linux 内核是全球最大的开源项目之一,拥有数千名贡献代码的开发者,且每次发布版本都会涉及数百万行代码的变更。
该项目基于 GPLv2 许可证发布 。简而言之,该许可证要求:如果包含内核修改的软件被交付给客户,则必须向客户提供相应的修改内容(尽管在实际操作中,大多数公司都会直接公开源代码)。
许多公司(其中不乏竞争对手)以及学术界人士和独立开发者,都在为 Linux 内核贡献代码。
目前的开发模式基于固定的发布周期(通常为 3 到 4 个月)。新功能会在为期一到两周的"合并窗口期"内合入内核。合并窗口期结束后,项目会按周发布候选版本(如 rc1、rc2 等)。
2 . 维护者层级
为了扩展开发流程,Linux 采用了分层维护模式:
● Linus Torvalds 是 Linux 内核的维护者,负责合并来自子系统维护者的拉取请求( pull requests )。
● 每个子系统都有一名或多名维护者,负责接收来自开发者或设备驱动程序维护者的补丁(patch)或拉取请求(pull request)。
● 每位维护者都有自己的 Git 树,例如:
(1) Linux Torvalds:
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
(2)
David Miller (networking):
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git/
● 每个子系统都可以维护一个"-next"树,供开发人员提交针对下一个合并窗口的补丁。
由于合并窗口最长仅为两周,大多数维护者都维护着一个"-next"分支(tree);即便在合并窗口关闭期间,他们也能通过该分支接收来自开发者或下游维护者提交的新功能。
值得注意的是,即使在合并窗口关闭期间,维护者的分支仍会接受错误修复;上游维护者会针对每一个发布候选版本(release candidate),定期从这些分支中拉取(pull)这些修复内容。
3 . Linux源代码布局

这些是 Linux 源代码文件夹的顶层目录:
● arch(architecture) ------ 包含具体架构的代码;每种架构都在指定的子文件夹(例如 arm,arm64,x86)中实现。
● block ------ 包含处理块设备数据读写的块子系统代码:创建块 I/O 请求、调度请求(有多种 I/O 调度器可供选择)、合并请求,以及将请求通过 I/O 栈向下传递给块设备驱动程序。
● certs ------ 实现对使用证书进行签名验证的支持。
● crypto ------ 各种密码学算法的软件实现,以及支持将此类算法卸载至硬件执行的框架。
● Documentation ------ 各类子系统的文档、Linux 内核命令行选项、sysfs 文件及其格式的说明、设备树绑定(支持的设备树节点及格式)。
● drivers ------ 针对各种设备的驱动程序,以及 Linux 驱动程序模型实现(一种描述驱动程序、设备、总线及其连接方式的抽象)。
● firmware ------ 由各种设备驱动程序使用的二进制或十六进制固件文件 。
● fs ------ 虚拟文件系统切换层(通用文件系统代码)及各种文件系统驱动程序存放处。
● include ------ 头文件。
● init ------ 在引导期间运行的通用(即非特定于架构的)初始化代码。
● ipc ------ 针对消息队列、信号量、共享内存等各种进程间通信(IPC)系统调用的实现。
● kernel ------ 进程管理代码(包括对内核线程和工作队列的支持)、调度器、追踪、时间管理、通用中断(IRQ)代码、锁机制。
● lib ------ 各种通用功能,如排序、校验和、压缩与解压缩、位图操作等。
● mm ------ 涉及物理内存与虚拟内存的内存管理代码,包括页(page)、SL*B 和 CMA 分配器、交换(swapping)、虚拟内存映射、进程地址空间操作等。
● net ------ 针对包括 IPv4 和 IPv6 在内的各种网络协议栈的实现;BSD 套接字实现、路由、过滤、数据包调度、桥接等。
● samples ------ 各种驱动的例子。
● scripts ------ 构建系统组件、用于构建模块的脚本、Linux 内核配置工具 kconfig,以及其他各类脚本( 例如用于检查补丁是否符合 Linux 内核编码风格的 checkpatch.pl )。
● security ------ 这里是 Linux 安全模块( Linux Security Module )框架的存放处,该框架允许扩展默认的(Unix)安全模型,同时也包含了 SELinux、Smack、AppArmor、Tomoyo 等多种此类扩展的实现。
● sound ------ ALSA(高级 Linux 声音系统)及旧版 Linux 声音框架(OSS)存放处。
● tools ------ 用于测试 Linux 内核子系统或与其交互的各种用户空间工具。
● usr ------ 支持将 initrd 文件嵌入到内核镜像中。
● virt ------ KVM(内核虚拟机) hypervisor 的发源地。
4 . Linux内核架构

4.1 arch(architecture)
● 架构相关代码。
● 可能进一步细分为机器相关代码。
● 与引导加载程序交互以及架构相关初始化。
● 访问各种架构或机器特定的硬件位,例如中断控制器、SMP 控制器、总线控制器、异常和中断设置、虚拟内存处理。
● 架构优化函数(例如 memcpy、字符串操作等)。
Linux 内核的这一部分包含特定于架构的代码,并且可能针对某些架构(例如 ARM)进一步细分为特定于机器的代码。
"Linux 最初是为基于 32 位 x86 架构的个人电脑( 386 或更高版本 )开发的。如今,它至少可以在 Compaq Alpha AXP、Sun SPARC 和 UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64 和 CRIS 架构上运行。"
它实现了对各种特定于架构或机器的硬件位的访问,例如中断控制器、SMP 控制器、总线控制器、异常处理和中断建立、虚拟内存处理。
它还实现了针对特定架构优化的功能(例如 memcpy、字符串操作等)。
4.2 设备驱动
Linux 内核使用统一设备模型,其目的是维护反映系统状态和结构的内部数据结构。这些信息包括哪些设备存在、它们的状态、它们连接到哪个总线、它们连接到哪个驱动程序等等。这些信息对于实现系统级电源管理、设备发现和动态设备移除至关重要。
每个子系统都有其特定的驱动程序接口,这些接口针对其所代表的设备进行了定制,以便于编写正确的驱动程序并减少代码重复。
Linux 支持种类繁多的设备驱动程序,例如:TTY、串口、SCSI、文件系统、以太网、USB、帧缓冲区、输入、声音等等。
4.3 进 程管理
Linux 实现了标准的 Unix 进程管理 API,例如 fork()、exec() 和 wait(),以及标准的 POSIX 线程。
然而,Linux 进程和线程的实现方式与其他内核截然不同。Linux 没有内部结构来实现进程或线程,而是使用一个名为 task_struct 的结构体来描述一个名为 task 的抽象调度单元。
一个 task 拥有指向资源的指针,例如地址空间、文件描述符、IPC ID 等。属于同一进程的任务的资源指针指向相同的资源,而不同进程的任务的资源指针则指向不同的资源。
这种特性,结合 clone() 和 unshare() 系统调用,使得 Linux 能够实现命名空间等新特性。
命名空间与控制组 ( cgroup ) 结合使用,在 Linux 中实现操作系统虚拟化。
cgroup 是一种以可控且可配置的方式,将进程分层组织并沿层次结构分配系统资源的机制。
4.4 内存管理
Linux 内存管理是一个复杂的子系统,它处理以下问题:
● 物理内存管理:内存分配和释放。
● 虚拟内存管理:分页、交换、按需分页、写时复制。
● 用户服务:用户地址空间管理(例如 mmap()、brk()、共享内存)。
● 内核服务:SL*B 分配器、vmalloc 。
4.5 块 I/O 管理
Linux 块 I/O 子系统处理从块设备读取和写入数据:创建块 I/O 请求、转换块 I/O 请求(例如,用于软件 RAID 或 LVM)、合并和排序请求,并通过各种 I/O 调度程序将它们调度到块设备驱动程序。

4.6 虚拟文件系统开关(Virtual Filesystem Switch)
Linux虚拟文件系统开关实现了通用文件系统代码,以减少文件系统驱动程序中的重复代码。它引入了一些文件系统抽象概念,例如:
● inode ------ 描述磁盘上的文件(属性、数据块在磁盘上的位置)。
● dentry ------ 将 inode 与文件名关联起来(目录项)。
● file ------ 描述已打开文件的属性(例如文件指针)。
● superblock ------ 描述已格式化文件系统的属性(例如块数、块大小、根目录在磁盘上的位置、加密方式等)。

Linux VFS 还实现了一种复杂的缓存机制,其中包括以下内容:
● inode 缓存 ------ 缓存文件属性和内部文件元数据。
● dentry 缓存 ------ 缓存文件系统的目录层次结构。
● page 缓存 ------ 缓存内存中的文件数据块。
4.7 网络栈

4.8 Linux安全模块
● 用于扩展默认 Linux 安全模型的钩子。
● 被多个 Linux 安全扩展程序使用:
(1) 安全增强型 Linux
(2) AppArmor
(3) Tomoyo
(4) Smack