当前位置: 首页 > news >正文

【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 源代码采用清晰的目录架构以反映其模块模块化结构:

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 抽象链图示

[ 用户应用 ]↓ 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按照标准结构挂载虚拟与持久文件系统
http://www.dtcms.com/a/272296.html

相关文章:

  • Linux 内核日志中常见错误
  • idea安装maven 拉取依赖失败的解决办法
  • 网络基本概念
  • Ubuntu22.0.4安装PaddleNLP
  • Android Coil 3 data加载图的Bitmap或ByteArray数据类型,Kotlin
  • Redis BigKey 深度解析:从原理到实战解决方案
  • arm架构,arm内核,处理器之间的关系
  • 【部分省份已考真题】备战2025全国青少年信息素养大赛-算法创意实践挑战赛c++省赛/复赛真题——被污染的药剂
  • 如何发现Redis中的bigkey?
  • Django中序列化与反序列化
  • Python(31)PyPy生成器优化深度解析:JIT加速下的Python性能革命
  • 查看已安装 Django REST Framework (DRF) 版本
  • 【提高篇-基础知识与编程环境:1、Linux系统终端中常用的文件与目录操作命令】
  • 力扣-54.螺旋矩阵
  • QT - 串口QserialPort应用
  • C语言——预处理详解
  • C#中异步任务取消:CancellationToken
  • 【C++详解】STL-list模拟实现(深度剖析list迭代器,类模板未实例化取嵌套类型问题)
  • 【TCP/IP】10. 引导协议与动态主机配置协议
  • prometheus+grafana接入nginx实战
  • 零成本实现商品图换背景
  • 静态路由实验(2)
  • Vue3 深度解析:渲染器与渲染函数的奥秘
  • 【PTA数据结构 | C语言版】链式栈的3个操作
  • linux 4.14 kernel屏蔽arm arch timer的方法
  • 网络编程与自动化
  • 高亚科技签约奕源金属,助力打造高效智能化采购管理体系
  • Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
  • 在 Ubuntu 上安装和配置 Kafka
  • 下一代防火墙-终端安全防护