Linux Kernel 之 内核架构、源码文件、API/ABI 、FHS
一、内核架构(Kernel Architecture)
Linux 是一个 可抢占、模块化的单体内核,其关键子系统包括进程调度、虚拟内存、I/O、设备驱动、网络、文件系统和安全等。
架构可概括为:
用户空间(User space):运行应用程序,通过系统调用与内核交互;
内核空间(Kernel space):管理硬件资源、调度、安全策略。
内核本身虽为单体内核,但支持 加载模块,如文件系统、驱动、网络协议等。同时,它对多种 CPU 架构(x86/x64、ARM/AArch64、RISC-V、MIPS 等)提供支持 。
-
Linux 采用"模块化单体内核"设计:
- 内核主要功能(调度、网络、文件系统等)都运行在内核空间(单体框架);
- 同时通过可加载模块(loadable kernel modules)支持驱动、文件系统等按需加载卸载 ([DEV Community][3], [ARMO][4])
-
维护机制:各子系统由专门维护者负责,Linus → subsystem maintainers → sub-sub-system,确保代码质量、模块边界清晰
-
模块化带来:
- 内存/性能优化:仅加载必要组件;
- 易于维护与更新:驱动可独立升级,无需重启或编译整个内核。
二、源码结构(Source Code Organization)
Linux 源代码采用清晰的目录架构以反映其模块模块化结构:
txt
kernel/ # 内核核心逻辑与调度
mm/ # 内存管理
fs/ # 文件系统实现与 VFS
net/ # 网络子系统
drivers/ # 各类设备驱动
arch/ # 各 CPU 架构支持,保存与 CPU 相关的启动、异常、中断、页表管理等代码
include/ # 通用与架构相关头文件
init/ # 内核初始化入口
ipc/ # 进程间通信机制
# kernel/, mm/, fs/, net/ 等目录是内核总逻辑中主要子系统各自实现。
三、API 与 ABI
3.1 用户空间 API / ABI
3.1.1 概念
-
API(Application Programming Interface) 指供用户空间使用的系统调用,如 open, read, write, mount。
-
ABI(Application Binary Interface) 是这些 API 的二进制接口标准(参数传递、结构体布局、枚举顺序、返回值等),需要保持长期兼容。
Linux 为稳定 ABI 提供保障机制,并分层分别维护如下文档路径:
- Documentation/ABI/stable/:会长期兼容(至少 2 年)
- .../testing/、obsolete/、removed/
3.1.2 稳定的用户空间API
- Linux 核心承诺"不会破坏用户空间",即系统调用接口(syscalls)、结构体布局、符号定义、procfs、sysfs 等保持长期兼容 ([Opensource.com][1])
- 这些接口保留为 stable ABI,用户空间程序(或静态编译)在新内核发布后仍可正常运行,不需重编译 ([Reddit][2])
- 开发者通过
Documentation/ABI/stable/
等保持明确文档约定,确保兼容性;
3.1.3 系统组织:分层抽象实现全链条支持
Linux 通过清晰的层次架构,将硬件与用户空间程序隔离:
-
用户空间(user-space)
调用系统调用(例如
open()
/read()
)与 C 库交互,由 kernel 提供 ABI 支持。 -
系统调用接口层
Kernel 通过 syscall 实现功能提供,同时保证 ABI 稳定兼容。
-
内核空间(kernel-space)
包含核心子系统如调度、内存管理、VFS、net、block layer、设备驱动等,结合 LSM 钩子机制进行安全控制
-
硬件抽象层(HAL)与驱动
驱动作为模块实现对硬件的封装,模块化加载可扩展硬件支持。
-
CPU 与 MMU 支持
在
arch/
目录下,不同架构(比如 ARM、x86、RISC-V 等)有独立启动、异常、中断、页表实现,支撑跨平台运行
3.1.4 从用户空间到底层硬件的完整路径
整体路径如下:
[用户进程]
↳ syscalls → ABI 接口
↳ VFS / Scheduler / MM / Net
↳ 调用驱动接口
↳ 驱动模块调用硬件操作
↳ 最终通过总线/寄存器操作硬件
- 用户调用库函数最终通过系统调用进入内核;
- 内核对业务进行调度、访问、权限检查、安全处理后委派到底层驱动;
- 驱动通过 MMU、IO MMU、DMA 访问物理硬件资源;
- 架构代码将对应寄存器读写、异常处理转为硬件可执行动作;
- 内核通过统一抽象将变化隐藏,保证上层不感知底层差异。
3.2 内核空间接口(Kernel-internal API)
3.2.1 概念
- 这些接口供驱动、子系统在内核内部调用,包括链表操作、原子操作、中断控制等;
- 不保证稳定性,核心开发者可以在必要时修改 。
3.2.2
四、FHS 借助内核的表现(Filesystem Hierarchy Standard)
- FHS 规定系统级文件系统目录结构: /bin, /usr, /lib, /etc, /var, /sys, /proc 等;
- 内核通过 虚拟文件系统(如 sysfs、procfs)映射出诸如 /sys, /proc, /dev, /run 等应用程序可查看的系统信息;
- 合规的分区与库路径是用户空间标准,而对应内核文件系统则提供支撑与接口。
五、一致性保障要素
维度 | 实现策略 |
---|---|
ABI 稳定性 | 稳定 syscalls 和结构定义 / 透明文档 / 社区共识 |
模块化设计 | 模块机制 + 子系统维护者 / 代码审核流程 |
分层架构 | 明确用户 / 系统调用 / 核心 / 驱动 / 硬件 层级 |
多架构支持 | arch/ 目录下的体系结构无侵扰主逻辑 |
硬件抽象 | VFS、LSM、驱动、架构层共同实现跨设备抽象 |
通过这些机制,Linux 内核实现了从用户应用到硬件驱动的高效抽象链,在不同发行版、硬件架构与内核版本间保持高度一致性。
六、抽象链
Linux 内核实现从用户应用到硬件驱动的高效抽象链,主要通过多层接口与系统设计来实现。这些层次共同配合,提供了从用户层 API 到硬件操作的完整路径,同时确保性能、安全与可维护性。
6.1 用户空间 ↔ 内核空间:系统调用(Syscalls)
- 用户程序通过标准库(如glibc)的函数调用(如
read()
、open()
)进入内核,实现特权切换 ([form3.tech][1])。 - 系统调用接口(如
sys_read()
)由内核实现,并保持高度稳定以保证 ABI 兼容 。 - 特权切换通过陷入中断/异常机制执行,确保用户层无法直接访问硬件。
6.2 VFS、调度、内存等核心服务
- 系统调用进入后,VFS、调度器、内存管理等内核子系统参与协作处理请求 。
- VFS 根据路径查找 dentry / inode,执行文件 I/O。
- 内存管理 确保存取缓存页、分配空间、触发 page‑fault。
- 调度器 分配 CPU,确保并发与实时性。
这些子系统抽象了硬件和资源,提供一致的接口给上层逻辑。
6.3 内核模块与驱动:设备接口统一化
- 内核虽为单体结构,但模块化支持动态加载驱动代码 。
- 驱动通过标准接口(如
read()
,ioctl()
,write()
、request_irq()
,dma_alloc_coherent()
)与核心协作,实现硬件访问。 - 上层 VFS、设备框架无需关心硬件详情,驱动提供统一调用入口。
6.4 硬件抽象层:架构相关实现与总线支持
- 在
arch/
下,不同 CPU 架构(如 x86、ARM、RISC‑V)提供中断处理、页表配置、异常同步等实现 。 - 总线(如 PCI、USB、I²C、SPI)由公共子系统与驱动层支持,实现设备发现与资源分配。
sysfs
、udev
等机制在用户空间呈现设备视图,形成完整的通知与配置流程。
6.5 实际硬件访问:寄存器读写与 DMA
- 驱动最终通过 I/O 操作(MMIO/U‑IO)、DMA 引擎等直接与硬件交换数据。
- 异步事件如中断通过 IRQ 注册机制传递至内核,进一步向上调度响应逻辑。
6.6 架构层与硬件协作
- 用户层发起系统调用 → 内核核心逻辑处理 → VFS 或设备驱动接口调用 → 驱动执行硬件读写 → CPU/MMU 异常与架构代码协作完成。
- 多核系统下,调用还需处理 同步机制(如自旋锁、RCU 等),确保数据一致性与并发性能。
6.7 抽象链图示
css
[ 用户应用 ]
↓ syscall()/syscall trap
[ 系统调用接口 ]
↓ VFS / Scheduler / Memory Manager
[ 内核子系统 ]
↓ 调用驱动接口
[ 驱动模块 (可动态加载) ]
↓ MMIO / DMA / IRQ
[ 架构 + 总线层实现 (arch/, PCI, USB等) ]
↔ 硬件寄存器与总线
6.8 小结
Linux 核心提供了如下关键抽象特性:
- 系统调用接口:实现应用程序与内核的安全通信,保障 ABI 兼容。
- 核心服务层(VFS、memory、sched、net):集中处理资源调度与管理,提供统一服务接口。
- 设备驱动模块:屏蔽硬件差异,将具体操作细节封装后暴露标准化 API。
- 架构与总线实现 :在
arch/
目录下提供不同硬件的支持,实现真正睿智的多平台能力。 - 硬件操作:由 MMIO、DMA、IRQ 等细粒度机制支持,构成完整闭环。
总结
项目 | 内容说明 |
---|---|
架构 | 单体 + 模块化可抢占内核 |
代码结构 | 以子系统为单元目录组织 |
API / ABI | 用户空间接口兼容,内核空间接口可变 |
FHS | 按照标准结构挂载虚拟与持久文件系统 |