【AI学Linux】内核架构总览
·
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
阅读建议
- 建立全局观:先读 01 + 02,理解内核的角色和子系统关系
- 定位能力:读 03,知道代码在哪里找
- 驱动开发者必读:04 + 05,从 DTB 到 probe 的完整路径
- 读源码前:06,认识 list_head/rb_tree/container_of 才能读懂内核代码
- 编译内核时:07,理解 Kconfig/Kbuild/模块系统
下一模块:L2-arm64 — ARM64 架构细节
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)