内核版本:Linux 6.19.10


前言:为什么要理解 Linux 内核代码树?

Linux 内核是现代操作系统基础设施中最复杂、最关键的开源项目之一。无论是服务器、云平台、Android 手机、嵌入式设备,还是容器、虚拟化、网络转发、存储系统,其底层都离不开 Linux 内核的支撑。

但第一次打开 Linux 内核源码时,很多人都会被庞大的目录结构“劝退”:

arch/ drivers/ fs/ kernel/ mm/ net/ block/ security/ ...

这些目录并不是简单的源码分类,而是 Linux 内核按照职责划分出来的核心子系统。理解这些目录之间的关系,相当于拿到了阅读内核源码的“地图”。

本文将基于 Linux 6.19.10 内核代码树,从顶层目录出发,系统梳理各个核心模块的职责、典型源码文件、模块间依赖关系,以及几个值得重点关注的新机制,例如 EEVDF 调度器、io_uring、eBPF、Rust for Linux 和 KVM 虚拟化。


一、Linux 6.19.10 顶层目录全景

Linux 内核源码顶层目录大致可以分为几类:

  • 体系结构相关代码arch/
  • 核心内核机制kernel/mm/ipc/security/
  • I/O 与文件系统fs/block/io_uring/
  • 设备驱动drivers/sound/
  • 网络协议栈net/
  • 公共库与接口定义include/lib/crypto/
  • 构建、文档与工具scripts/Documentation/tools/
  • 虚拟化与新语言支持virt/rust/

顶层目录结构如下:

linux-6.19.10/
├── arch/                # 体系结构相关代码
├── block/               # 块设备层
├── certs/               # 内核签名证书
├── crypto/              # 软件加密算法库
├── Documentation/       # 内核文档
├── drivers/             # 设备驱动程序
├── fs/                  # 文件系统
├── include/             # 内核头文件
├── init/                # 内核启动初始化
├── io_uring/            # 高性能异步 I/O 框架
├── ipc/                 # 进程间通信
├── kernel/              # 内核核心子系统
├── lib/                 # 通用库函数
├── LICENSES/            # 许可证文件
├── mm/                  # 内存管理
├── net/                 # 网络协议栈
├── rust/                # Rust 语言内核支持
├── samples/             # 示例代码
├── scripts/             # 构建系统与辅助脚本
├── security/            # 安全框架
├── sound/               # 音频子系统
├── tools/               # 用户空间工具
├── usr/                 # initramfs 相关
└── virt/                # 虚拟化支持

可以把 Linux 内核理解为一个分层系统:

用户空间应用
    ↓ 系统调用
kernel/ 核心机制
    ↓
mm/ fs/ net/ security/
    ↓
block/ drivers/
    ↓
arch/
    ↓
硬件

二、arch/:体系结构适配层

arch/ 是 Linux 内核可移植性的基础。不同 CPU 架构在启动流程、中断入口、页表格式、寄存器布局、系统调用 ABI 等方面差异巨大,而这些差异都被封装在 arch/ 目录下。

典型架构包括:

架构目录 说明
arch/x86/ Intel/AMD x86 与 x86_64,PC 和服务器主流平台
arch/arm/ 32 位 ARM,常见于嵌入式设备
arch/arm64/ 64 位 ARM,手机、服务器、Apple M 系列等
arch/riscv/ RISC-V 开源指令集,增长迅速
arch/loongarch/ 龙芯 LoongArch 架构
arch/powerpc/ IBM POWER/PowerPC
arch/s390/ IBM 大型机
arch/um/ User Mode Linux,将内核运行为用户进程

每个架构目录通常包含:

arch/x86/
├── boot/          # 启动引导代码
├── kernel/        # 中断、异常、系统调用、上下文切换
├── mm/            # 架构相关内存管理
├── lib/           # 架构优化库函数
├── include/asm/   # 架构专用头文件
└── configs/       # 默认配置

例如在 x86 平台上,内核启动时会经历实模式、保护模式、长模式切换,建立早期页表,然后进入 C 语言世界中的 start_kernel()。这些硬件强相关逻辑都位于 arch/x86/ 下。

一句话总结:arch/ 负责把不同硬件平台的差异“藏起来”,向上层内核提供统一抽象。


三、kernel/:内核核心子系统

kernel/ 是 Linux 内核的中枢,负责进程生命周期、调度、同步、中断、系统调用、内核线程、cgroup、BPF、RCU 等基础机制。

1. 进程管理

与进程相关的关键文件包括:

文件 功能
fork.c 进程创建,支持 fork()clone()vfork()
exit.c 进程退出,核心函数如 do_exit()
exec.c 执行新程序,处理 execve()
signal.c 信号处理
pid.c PID 分配与管理
cred.c 进程权限凭证,如 UID、GID、Capabilities
ptrace.c 进程跟踪,调试器和 strace 的基础

用户空间创建进程时,最终会进入内核的 fork.c。进程退出时,则由 exit.c 负责释放资源、通知父进程、处理僵尸进程等。

2. 调度器:从 CFS 到 EEVDF

调度器源码位于:

kernel/sched/
├── core.c        # 调度器核心框架
├── fair.c        # 普通进程调度,CFS/EEVDF
├── rt.c          # 实时调度
├── deadline.c    # Deadline 调度
├── idle.c        # 空闲任务
├── topology.c    # CPU 拓扑感知
├── pelt.c        # PELT 负载跟踪
└── features.h    # 调度特性开关

Linux 6.x 的普通任务调度已经从传统 CFS 演进到 EEVDF(Earliest Eligible Virtual Deadline First)。相比旧版 CFS 主要依赖虚拟运行时间 vruntime,EEVDF 引入了“虚拟截止时间”概念,目标是在公平性与延迟之间取得更好的平衡。

Linux 调度类按优先级大致如下:

调度类 策略 场景
stop_sched_class 最高优先级 CPU 热插拔、迁移等特殊任务
dl_sched_class SCHED_DEADLINE 硬实时任务
rt_sched_class SCHED_FIFO / SCHED_RR 实时任务
fair_sched_class SCHED_NORMAL / BATCH 普通进程
idle_sched_class SCHED_IDLE CPU 空闲任务

调度器是理解 Linux 性能行为的关键模块。CPU 利用率、响应延迟、负载均衡、NUMA 亲和性、大小核调度,都与 kernel/sched/ 密切相关。

3. RCU:读多写少场景下的高性能同步

RCU 位于:

kernel/rcu/
├── tree.c       # 树形 RCU,主实现
├── tiny.c       # 单 CPU 简化实现
├── tasks.c      # Tasks RCU
└── srcutree.c   # SRCU,可睡眠 RCU

RCU 全称是 Read-Copy-Update。它允许读路径几乎无锁执行,非常适合读多写少的数据结构,例如:

  • 网络路由表
  • 文件描述符表
  • dentry cache
  • BPF 程序替换
  • 内核对象生命周期管理

RCU 是 Linux 能够在多核系统上保持高扩展性的关键机制之一。

4. 锁机制

锁相关代码位于:

kernel/locking/
├── mutex.c
├── spinlock.c
├── rwsem.c
├── semaphore.c
├── lockdep.c
└── qspinlock.c

常见同步原语包括:

类型 特点
自旋锁 spinlock 忙等待,不可睡眠,常用于中断上下文
互斥锁 mutex 可睡眠,适合进程上下文
读写信号量 rwsem 读多写少场景
信号量 semaphore 传统同步机制
lockdep 死锁检测框架

5. eBPF 与 cgroup

kernel/bpf/ 实现了 eBPF 虚拟机、验证器、系统调用接口和 Map 类型。eBPF 已经成为 Linux 内核可观测性、网络、安全策略扩展的重要基础。

kernel/cgroup/ 则是容器资源隔离的核心。Docker、Kubernetes 等容器技术大量依赖 cgroup 来限制 CPU、内存、IO 等资源。


四、mm/:内存管理子系统

内存管理是内核中最复杂的部分之一。mm/ 负责物理内存、虚拟内存、页表、缺页异常、页面回收、NUMA、大页、内存 cgroup 等。

核心文件包括:

mm/
├── page_alloc.c       # 伙伴系统,物理页分配
├── slub.c             # SLUB 对象分配器
├── mmap.c             # mmap 与 VMA 管理
├── memory.c           # 缺页异常处理
├── vmscan.c           # 页面回收
├── oom_kill.c         # OOM Killer
├── memcontrol.c       # memory cgroup
├── migrate.c          # 页面迁移
├── compaction.c       # 内存碎片整理
├── hugetlb.c          # HugeTLB 大页
├── kasan/             # 内存错误检测
├── kfence/            # 轻量内存安全检测
└── damon/             # 数据访问监控

内存分配链路

一个用户态 malloc() 最终可能触发如下链路:

应用程序 malloc()
    ↓
glibc
    ↓ brk/mmap 系统调用
mm/mmap.c
    ↓
VMA 管理
    ↓ 缺页异常
mm/memory.c
    ↓
mm/page_alloc.c
    ↓
物理页分配

而内核态的小对象分配通常经过:

kmalloc()
    ↓
SLUB/SLAB
    ↓
伙伴系统
    ↓
物理内存

伙伴系统与 SLUB

  • 伙伴系统:以页为单位管理物理内存,适合连续页分配。
  • SLUB:面向内核对象的小块内存分配器,是 kmalloc() 的重要基础。

页面回收与 OOM Killer

当内存紧张时,vmscan.c 负责扫描 LRU 链表并回收页缓存或匿名页。如果回收失败,oom_kill.c 会选择一个“牺牲进程”杀掉,以避免系统彻底失去响应。


五、fs/:文件系统与 VFS

fs/ 提供虚拟文件系统 VFS 层,并实现 ext4、btrfs、xfs、procfs、sysfs、overlayfs 等大量文件系统。

VFS 核心

VFS 的核心作用是屏蔽底层文件系统差异,让用户空间通过统一接口访问文件。

关键文件包括:

文件 功能
namei.c 路径名解析
dcache.c dentry 缓存
inode.c inode 管理
file.c 文件对象管理
super.c 超级块管理
open.c open()close()
read_write.c read()write()
eventpoll.c epoll
pipe.c 管道

一次 open("/etc/passwd") 的背后,内核要完成路径解析、目录项缓存查找、inode 获取、权限检查、文件对象创建等多个步骤。

主流文件系统

文件系统 特点
ext4/ Linux 最常用本地文件系统,稳定成熟
btrfs/ 写时复制、快照、校验、内置 RAID
xfs/ 高性能,适合大文件和高并发
f2fs/ 面向闪存优化,Android 常见
erofs/ 只读压缩文件系统,Android 系统分区常见
overlayfs/ 联合挂载,Docker 镜像层基础
proc/ /proc,进程和内核信息
sysfs/ /sys,设备模型和驱动属性
debugfs/ 内核调试接口
tracefs/ ftrace 追踪接口

epoll:高性能网络服务的基础

fs/eventpoll.c 实现了 epoll。Nginx、Redis、Envoy 等高性能服务程序都依赖 epoll 实现大规模连接复用。


六、drivers/:设备驱动程序

drivers/ 是 Linux 内核中代码量最大的目录,约占总代码量的大部分。它负责连接内核和真实硬件。

主要分类如下:

drivers/
├── ata/          # ATA/SATA/PATA
├── nvme/         # NVMe SSD
├── scsi/         # SCSI 存储
├── net/          # 网络设备驱动
├── gpu/          # GPU/DRM/KMS
├── usb/          # USB 协议栈
├── input/        # 输入设备
├── pci/          # PCI/PCIe
├── i2c/          # I2C
├── spi/          # SPI
├── gpio/         # GPIO
├── clk/          # 时钟框架
├── cpufreq/      # CPU 调频
├── cpuidle/      # CPU 空闲状态
├── virtio/       # VirtIO 虚拟设备
├── vfio/         # 设备直通
├── media/        # 摄像头与视频
├── iio/          # 工业 IO
├── hwmon/        # 硬件监控
└── staging/      # 待完善驱动

存储驱动

  • drivers/nvme/:NVMe SSD,高性能存储的核心。
  • drivers/scsi/:传统 SCSI 栈,仍广泛用于服务器。
  • drivers/ata/:SATA/PATA 存储设备。

网络驱动

drivers/net/ 包含以太网、无线网卡、虚拟网卡等驱动。例如:

  • Intel/Realtek/Mellanox 以太网
  • WiFi 驱动
  • virtio_net.c 虚拟网卡
  • tun.c TUN/TAP 设备,VPN 和容器网络常用

GPU 与显示

GPU 驱动集中在 drivers/gpu/drm/

drivers/gpu/drm/
├── i915/      # Intel 集成显卡
├── amd/       # AMDGPU
├── nouveau/   # NVIDIA 开源驱动
├── virtio/    # 虚拟 GPU
└── panel/     # 显示面板

DRM/KMS 是现代 Linux 图形栈的内核基础。

虚拟化相关驱动

  • virtio/:半虚拟化设备框架。
  • vfio/:设备直通,让虚拟机直接访问硬件。
  • vhost/:内核态 VirtIO 后端。

七、net/:网络协议栈

net/ 实现了 Linux 的完整网络协议栈,从 Socket 到 TCP/IP、netfilter、XDP、无线网络、蓝牙协议等。

核心结构如下:

net/
├── core/          # 网络核心
├── ipv4/          # IPv4 协议栈
├── ipv6/          # IPv6 协议栈
├── netfilter/     # 防火墙与包过滤
├── bridge/        # 网桥
├── wireless/      # 无线网络框架
├── bluetooth/     # 蓝牙协议栈
├── unix/          # Unix Domain Socket
├── packet/        # 原始包捕获
├── xdp/           # 高性能包处理
├── bpf/           # 网络 BPF
├── sched/         # 流量控制
├── tls/           # 内核 TLS
└── mptcp/         # 多路径 TCP

TCP/IP

IPv4 相关代码位于 net/ipv4/

文件 功能
tcp.c TCP 核心
tcp_input.c TCP 接收处理
tcp_output.c TCP 发送处理
tcp_cubic.c CUBIC 拥塞控制
tcp_bbr.c BBR 拥塞控制
udp.c UDP
route.c IPv4 路由
icmp.c ICMP,ping 的基础

netfilter:防火墙与 NAT

net/netfilter/ 是 iptables/nftables 的内核基础,支持包过滤、NAT、连接跟踪、负载均衡等能力。

XDP:高速网络包处理

XDP 即 eXpress Data Path,允许在网络包进入协议栈之前执行 eBPF 程序。它适合:

  • DDoS 防护
  • 高性能负载均衡
  • 包过滤
  • 网络可观测性
  • 数据中心转发加速

八、block/:块设备层

block/ 位于文件系统和存储驱动之间,负责统一块设备抽象、请求队列、IO 调度、cgroup IO 控制等。

核心文件包括:

block/
├── blk-core.c        # 块层核心
├── blk-mq.c          # 多队列块层
├── blk-mq-sched.c    # MQ 调度器框架
├── blk-cgroup.c      # 块设备 cgroup
├── blk-throttle.c    # IO 限速
├── elevator.c        # IO 调度器框架
├── bfq-iosched.c     # BFQ 调度器
├── kyber-iosched.c   # Kyber 调度器
├── mq-deadline.c     # MQ Deadline 调度器
├── blk-zoned.c       # 分区块设备
└── bio.c             # BIO 基本请求单元

blk-mq:多队列块层

现代 NVMe SSD 支持多队列并发提交。传统单队列块层无法充分发挥硬件能力,因此 Linux 引入了 blk-mq:

CPU 本地提交队列
    ↓
硬件提交队列
    ↓
NVMe 控制器

blk-mq 显著降低了锁竞争,提高了多核系统上的存储 I/O 吞吐能力。

IO 调度器

常见 IO 调度器包括:

调度器 特点
BFQ 注重交互体验和公平性
Kyber 面向低延迟设备优化
MQ-Deadline 提供截止时间保证,防止饥饿

九、security/:安全框架

Linux 安全框架的核心是 LSM,即 Linux Security Module。它允许多个安全模块在关键内核路径上注册钩子,从而实现访问控制。

目录结构:

security/
├── security.c       # LSM 框架核心
├── commoncap.c      # Capabilities
├── selinux/         # SELinux
├── apparmor/        # AppArmor
├── smack/           # SMACK
├── tomoyo/          # TOMOYO
├── landlock/        # Landlock
├── integrity/       # IMA/EVM
├── keys/            # 内核密钥管理
└── bpf/             # BPF LSM

主要安全机制

模块 说明
SELinux 强制访问控制,常见于服务器和 Android
AppArmor 基于路径的访问控制,Ubuntu 默认
Landlock 用户态可用的沙箱机制,无需 root
IMA/EVM 文件完整性度量与验证
Keys 内核密钥管理
BPF LSM 使用 eBPF 实现安全策略扩展

安全模块通常会在文件访问、进程创建、Socket 操作、权限检查等路径上介入。


十、init/:内核启动入口

init/ 负责内核从启动到运行第一个用户态进程的全过程。

关键文件:

init/
├── main.c              # start_kernel()
├── do_mounts.c         # 挂载根文件系统
├── do_mounts_initrd.c  # initrd 支持
├── initramfs.c         # initramfs 解压
├── calibrate.c         # BogoMIPS 校准
└── init_task.c         # 初始任务

内核启动流程可以概括为:

上电/复位
    ↓
BIOS/UEFI
    ↓
Bootloader
    ↓
arch/x86/boot/
    ↓
arch/x86/kernel/head_64.S
    ↓
init/main.c:start_kernel()
    ├── 初始化内存管理
    ├── 初始化调度器
    ├── 初始化中断
    ├── 初始化时钟
    ├── 初始化各子系统
    └── rest_init()
          ├── 创建 kernel_init
          ├── 创建 kthreadd
          └── 进入 idle
                ↓
          执行 /sbin/init

start_kernel() 是阅读 Linux 启动流程时最重要的函数之一。


十一、include/:内核接口定义中心

include/ 定义了内核子系统之间的接口、数据结构、宏和常量。

重要目录:

include/
├── linux/          # 通用内核头文件
├── asm-generic/    # 架构无关汇编级头文件
├── uapi/           # 用户空间 API
├── net/            # 网络头文件
├── drm/            # DRM 图形框架
├── dt-bindings/    # 设备树绑定
├── media/          # V4L2/DVB
├── rdma/           # RDMA
├── scsi/           # SCSI
├── sound/          # ALSA
└── trace/          # 追踪框架

常见头文件:

文件 功能
include/linux/sched.h task_struct 等进程结构
include/linux/mm_types.h 内存管理类型
include/linux/fs.h VFS 核心结构
include/linux/list.h 内核链表
include/linux/rbtree.h 红黑树
include/linux/spinlock.h 自旋锁
include/linux/mutex.h 互斥锁
include/linux/module.h 内核模块接口
include/uapi/ 暴露给用户空间的 ABI

其中 uapi/ 非常重要,因为它定义了用户空间可见接口,必须保持 ABI 稳定。


十二、crypto/lib/:算法和公共库

crypto:加密算法库

crypto/ 提供内核中的通用软件加密算法:

crypto/
├── aes_generic.c
├── sha256_generic.c
├── sha512_generic.c
├── rsa.c
├── ecdh.c
├── chacha20poly1305.c
├── gcm.c
├── hmac.c
├── drbg.c
├── lz4.c
├── zstd.c
└── api.c

这些能力可被以下模块使用:

  • IPsec
  • dm-crypt
  • fscrypt
  • TLS
  • 随机数生成
  • 文件完整性校验

lib:通用数据结构和算法

lib/ 提供内核各处复用的数据结构和工具函数:

lib/
├── rbtree.c
├── list_sort.c
├── bitmap.c
├── string.c
├── vsprintf.c
├── idr.c
├── xarray.c
├── radix-tree.c
├── kfifo.c
├── crc32.c
├── kunit/
└── test_*.c

例如:

  • 调度器和内存管理大量使用红黑树。
  • 页缓存索引曾大量依赖 radix tree,现在逐步使用 XArray。
  • vsprintf.cprintk() 格式化输出的重要基础。

十三、ipc/:进程间通信

ipc/ 实现 System V IPC 和 POSIX IPC:

ipc/
├── msg.c        # 消息队列
├── sem.c        # 信号量
├── shm.c        # 共享内存
├── mqueue.c     # POSIX 消息队列
├── namespace.c  # IPC 命名空间
└── syscall.c    # IPC 系统调用入口

这些机制虽然历史较久,但仍被数据库、中间件和传统 UNIX 程序广泛使用。

在容器场景中,IPC namespace 用于隔离不同容器之间的 IPC 对象。


十四、io_uring/:新一代高性能异步 I/O

io_uring 是 Linux 5.1 引入的高性能异步 I/O 框架,核心思想是通过用户态和内核态共享环形队列,减少系统调用开销。

源码结构:

io_uring/
├── io_uring.c
├── io-wq.c
├── net.c
├── files.c
├── poll.c
├── timeout.c
├── sqpoll.c
└── register.c

传统 I/O 模型通常是:

用户态提交请求
    ↓ syscall
内核执行
    ↓ syscall 返回
用户态获取结果

而 io_uring 使用两个环:

  • SQ:Submission Queue,提交队列
  • CQ:Completion Queue,完成队列
用户态写 SQ
    ↓
内核消费 SQ 并执行 I/O
    ↓
内核写 CQ
    ↓
用户态读取 CQ

在 SQPOLL 模式下,甚至可以减少频繁系统调用,非常适合高性能存储、网络服务和数据库场景。


十五、virt/:KVM 虚拟化核心

virt/ 主要包含 KVM 核心代码:

virt/
├── kvm/
│   ├── kvm_main.c
│   ├── mmu/
│   ├── irqchip.c
│   └── eventfd.c
└── lib/

KVM 将 Linux 内核变成一个 Hypervisor。它和硬件虚拟化扩展配合工作:

  • Intel VT-x
  • AMD-V
  • ARM virtualization extensions

KVM 的关键职责包括:

  • 虚拟机创建与生命周期管理
  • vCPU 管理
  • 虚拟内存管理
  • 中断虚拟化
  • 与 QEMU 等用户态 VMM 协作

典型虚拟化栈如下:

虚拟机应用
    ↓
Guest Kernel
    ↓
QEMU
    ↓ ioctl
KVM
    ↓
硬件虚拟化扩展

十六、rust/:Rust for Linux

Linux 6.1 开始引入 Rust 作为第二种内核编程语言。rust/ 目录提供 Rust 内核模块和驱动开发所需的基础设施。

rust/
├── kernel/
│   ├── lib.rs
│   ├── alloc.rs
│   ├── sync/
│   ├── net/
│   └── driver.rs
├── macros/
└── bindgen_parameters

Rust 引入内核的主要目标不是替代 C,而是在部分新驱动中降低内存安全问题:

  • 空指针
  • Use-after-free
  • 越界访问
  • 数据竞争
  • 生命周期错误

Rust for Linux 仍处于持续演进阶段,但它代表了内核开发在安全性方向的重要探索。


十七、模块间依赖关系

Linux 内核并不是一堆孤立模块,而是一个层次清晰、相互协作的系统。

可以用下面的图表示:

┌──────────────────────────────────────────────┐
│                用户空间应用程序               │
│       glibc / syscall / proc / sys / dev      │
└──────────────────────┬───────────────────────┘
                       │
                       ▼
┌──────────────────────────────────────────────┐
│                 kernel/ 核心子系统            │
│  进程管理 调度 信号 RCU 锁 BPF cgroup 审计     │
└──────┬────────────┬────────────┬──────────────┘
       │            │            │
       ▼            ▼            ▼
┌──────────┐  ┌──────────┐  ┌──────────┐
│   mm/    │  │   fs/    │  │   net/   │
│ 内存管理 │  │ 文件系统 │  │ 网络协议 │
└────┬─────┘  └────┬─────┘  └────┬─────┘
     │             │             │
     └─────────────┼─────────────┘
                   ▼
┌──────────────────────────────────────────────┐
│                 block/ 块设备层               │
│          blk-mq / IO scheduler / BIO          │
└──────────────────────┬───────────────────────┘
                       ▼
┌──────────────────────────────────────────────┐
│                drivers/ 设备驱动              │
│      NVMe 网络 GPU USB PCI VirtIO VFIO        │
└──────────────────────┬───────────────────────┘
                       ▼
┌──────────────────────────────────────────────┐
│                 arch/ 体系结构层              │
│        x86 arm64 riscv loongarch powerpc      │
└──────────────────────┬───────────────────────┘
                       ▼
                    物理硬件

需要注意的是,这只是一个简化图。真实内核中,模块之间存在大量交叉关系:

  • fs/ 依赖 mm/ 做页缓存和内存映射。
  • net/ 依赖 mm/ 分配 sk_buff
  • drivers/ 会注册到 block/net/input/ 等框架。
  • security/ 通过 LSM 钩子嵌入几乎所有关键路径。
  • kernel/bpf/net/trace/security/ 深度集成。
  • cgroup 同时影响 CPU、内存、IO、网络等资源控制。

十八、构建系统与开发辅助文件

除了核心源码,Linux 顶层还有一些非常重要的构建和维护文件:

文件/目录 作用
Makefile 顶层构建文件
Kconfig 配置系统入口
Kbuild 内核构建规则
.config 当前内核配置
scripts/ 构建、检查、配置辅助脚本
MAINTAINERS 子系统维护者信息
COPYING GPL v2 许可证
Documentation/ 内核设计文档、API 文档、设备树绑定等
tools/ 用户空间工具,如 perf、bpftool

如果要学习内核开发,Documentation/tools/ 同样值得关注。很多子系统的设计理念、使用方法和调试方式都可以在文档中找到。


十九、如何阅读 Linux 内核源码?

面对如此庞大的代码树,不建议从顶层目录逐个文件“平铺式阅读”。更有效的方法是按场景切入。

1. 从系统调用切入

例如想理解文件打开:

open()
    ↓
fs/open.c
    ↓
VFS
    ↓
具体文件系统
    ↓
block 层
    ↓
存储驱动

2. 从性能问题切入

例如 CPU 调度延迟:

kernel/sched/core.c
kernel/sched/fair.c
kernel/sched/pelt.c
kernel/sched/topology.c

3. 从内存问题切入

例如 OOM:

mm/page_alloc.c
mm/vmscan.c
mm/oom_kill.c
mm/memcontrol.c

4. 从设备驱动切入

例如 NVMe:

drivers/nvme/
block/blk-mq.c
block/bio.c

5. 从容器技术切入

kernel/cgroup/
kernel/pid_namespace.c
kernel/user_namespace.c
fs/overlayfs/
net/netfilter/
security/

二十、总结

Linux 6.19.10 的代码树体现了 Linux 内核几十年来持续演进形成的工程结构:

  • arch/ 负责硬件平台差异。
  • kernel/ 提供调度、进程、同步、BPF、cgroup 等核心机制。
  • mm/ 管理物理内存和虚拟内存。
  • fs/ 通过 VFS 抽象不同文件系统。
  • drivers/ 连接内核和真实硬件。
  • net/ 实现完整网络协议栈。
  • block/ 管理块设备和 I/O 调度。
  • security/ 提供 LSM 安全框架。
  • io_uring/rust/virt/ 则代表了高性能 I/O、安全语言和虚拟化方向的持续演进。

学习 Linux 内核的关键,不是一次性记住所有目录和文件,而是建立一张清晰的地图:知道每个模块解决什么问题,知道遇到某类问题时应该去哪里找代码。

当你能把一次系统调用、一次网络收包、一次页面分配、一次进程调度串成完整链路时,Linux 内核代码树就不再是一片迷宫,而是一座结构严密、层次清晰的操作系统工程大厦。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐