L1:内核架构总览

建立完整的内核认知地图——各子系统在哪里、为什么存在、相互关系如何

理解各子系统在哪里、为什么存在、相互关系如何


一句话理解内核

内核是硬件资源的管理者用户程序的服务提供者。它站在两个边界之间:

┌────────────────────────────────────────────────────────┐
│                 用户空间 (EL0)                           │
│   nginx │ MySQL │ shell │ 你的应用 │ container          │
╞════════════════════════════════════════════════════════╡
│          边界①  syscall / 异常 / 中断返回               │
╞════════════════════════════════════════════════════════╡
│                 内核空间 (EL1)                           │
│                                                        │
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌──────┐ ┌───────┐ │
│  │内存管理│ │进程调度│ │  VFS   │ │网络栈│ │安全框架│ │
│  └────────┘ └────────┘ └────────┘ └──────┘ └───────┘ │
│  ┌────────┐ ┌────────┐ ┌────────┐ ┌──────┐ ┌───────┐ │
│  │中断/锁 │ │设备模型│ │ 块设备 │ │ DMA  │ │时钟/电源│ │
│  └────────┘ └────────┘ └────────┘ └──────┘ └───────┘ │
│                                                        │
╞════════════════════════════════════════════════════════╡
│          边界②  MMIO / 中断 / DMA / GPIO               │
╞════════════════════════════════════════════════════════╡
│                 硬件层                                   │
│   CPU │ GIC │ Timer │ MMC │ I2C │ SPI │ UART │ GPIO   │
└────────────────────────────────────────────────────────┘

文档导航

章节 文档 核心内容
内核角色 01-kernel-role.md 两个边界、syscall 穿越过程、MMIO/中断/DMA、执行上下文、一个 read() 的完整生命周期
子系统全景 02-subsystems.md 所有子系统的职责与存在理由、依赖关系图、"一切皆文件"的真实含义
源码目录 03-source-tree.md 每个顶层目录和关键子目录的详细解析、快速定位指南、入口文件推荐
设备模型 04-device-model.md kobject/device/driver/bus 四层抽象、platform 总线详解、DTB→probe 全流程、devm 资源管理
硬件基础设施 05-hw-infra.md pinctrl/clock/regulator/GPIO/DMA/IOMMU 六大框架、MMC probe 全框架协作图
数据结构 06-data-structures.md list_head/rb_tree/hlist/XArray/bitmap、container_of、内核编程模式(goto清理/ERR_PTR/kref)
构建系统 07-build-system.md Kconfig 语法/tristate/依赖、Kbuild Makefile、模块加载过程、符号导出

子系统层次与依赖

用户空间接口
  syscall │ /proc │ /sys │ /dev │ netlink │ ioctl
═══════════════════════════════════════════════════
  VFS(一切皆文件)
    │         │           │
    ▼         ▼           ▼
  块设备层   网络栈     伪文件系统
    │         │        (proc/sysfs)
    ▼         ▼
  设备驱动 ◀─────── 总线/设备模型
    │                    │
    ▼                    ▼
  硬件基础设施        sysfs 映射
  (pinctrl/clk/regulator/GPIO/DMA)
═══════════════════════════════════════════════════
  ┌─────────────── 三件套地基 ───────────────────┐
  │  内存管理        进程调度        中断/同步/时间 │
  │  buddy/slab     CFS/RT/DL      GIC/spinlock  │
  │  vmalloc/mmap   waitqueue      RCU/mutex      │
  │  page cache     signal         hrtimer/tick   │
  └──────────────────────────────────────────────┘

规律:先有内存 → 再有调度 → 再有中断 → 再有文件系统 → 再有驱动


一个请求的完整生命周期

read(fd, buf, 4096) 读取 SD 卡文件为例:

用户态  read(fd, buf, 4096)
          │ svc #0
─────── 边界① ───────────────────────
VFS       vfs_read() → file->f_op->read_iter
文件系统  ext4_file_read_iter() → page cache 未命中
块设备    submit_bio() → IO 调度
MMC核心   mmc_start_request() → CMD18 READ
MMC Host  sdhci_request() → writel(cmd, regs)
─────── 边界② ───────────────────────
硬件      SD 控制器 DMA 传输 → 完成中断
─────── 中断路径 ─────────────────────
ISR       sdhci_irq() → complete(&xfer_done)
块设备    bio_endio() → 数据到 page cache
VFS       copy_to_user(buf, ...) → 返回字节数
─────── 边界① ───────────────────────
用户态  read() 返回 4096

一次简单的 read() 穿越了 VFS、文件系统、块设备、MMC 驱动、中断、DMA、page cache、进程调度。


关键认知

主题 核心要点 详见
两个边界 syscall 隔离用户态,MMIO/中断/DMA 连接硬件 01
执行上下文 进程上下文能睡眠,中断上下文不能——决定了能用什么锁 01
子系统依赖 内存+调度+同步是地基,初始化顺序不能乱 02
一切皆文件 磁盘/设备/proc/socket 都通过 file_operations 统一 02
源码定位 mm/ 内存、kernel/sched/ 调度、drivers/ 驱动 03
设备匹配 DTB compatible → bus match → driver probe 04
硬件基础设施 probe 前需要 pinctrl/clock/regulator/reset 全部就绪 05
内嵌式数据结构 数据包含链表节点,container_of 还原结构体指针 06
tristate 三态 y=内建、m=模块、n=不编译,决定 obj-y/obj-m 07

问题分层——出问题时该看哪个子系统?

症状                         首先排查的子系统          关键工具
──────────────────────────  ──────────────────────  ─────────────────
应用响应慢                   调度器 → IO → 网络       perf sched / iostat
内存持续增长 / OOM            内存管理 → cgroup        /proc/pid/smaps / dmesg
IO 超时 / 数据损坏            VFS → 块设备 → 驱动      blktrace / dmesg
网络连接失败 / 丢包           网络栈 → netfilter       ss / tcpdump
CPU 100%                    调度器 → 用户代码         perf top / 火焰图
设备识别不到                  设备模型 → DT → 驱动      dmesg / /sys/bus/
权限拒绝                     安全框架 → 能力           audit / dmesg
系统卡死                     中断 / 死锁 / OOM         sysrq / crash

阅读建议

  1. 建立全局观:先读 01 + 02,理解内核的角色和子系统关系
  2. 定位能力:读 03,知道代码在哪里找
  3. 驱动开发者必读04 + 05,从 DTB 到 probe 的完整路径
  4. 读源码前06,认识 list_head/rb_tree/container_of 才能读懂内核代码
  5. 编译内核时07,理解 Kconfig/Kbuild/模块系统

下一模块:L2-arm64 — ARM64 架构细节

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐