【Note】Linux Kernel 之 内核架构、源码文件、API/ABI 、FHS

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)由公共子系统与驱动层支持,实现设备发现与资源分配。
  • sysfsudev 等机制在用户空间呈现设备视图,形成完整的通知与配置流程。

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 按照标准结构挂载虚拟与持久文件系统
相关推荐
MARS_AI_4 分钟前
大语言模型驱动智能语音应答:技术演进与架构革新
人工智能·语言模型·自然语言处理·架构·信息与通信
小小不董7 分钟前
深入理解oracle ADG和RAC
linux·服务器·数据库·oracle·dba
mCell27 分钟前
为什么我们需要 `.proto` 文件
后端·微服务·架构
宇钶宇夕1 小时前
SIMATIC S7-1200的以太网通信能力:协议与资源详细解析
运维·服务器·数据库·程序人生·自动化
杰夫贾维斯1 小时前
CentOS Linux 8 的系统部署 Qwen2.5-7B -Instruct-AWQ
linux·运维·人工智能·机器学习·centos
kfepiza2 小时前
Netplan 配置网桥(Bridge)的模板笔记250711
linux·tcp/ip·ubuntu
张先shen2 小时前
Elasticsearch RESTful API入门:索引的增删改查完全指南
java·大数据·elasticsearch·搜索引擎·架构·全文检索·restful
kfepiza2 小时前
用Netplan配置网桥bridge笔记250711
linux·ubuntu·debian
CodeWithMe2 小时前
【Note】Linux Kernel 实时技术深入:详解 PREEMPT_RT 与 Xenomai
linux·运维·服务器