一文读懂 Linux 6.19.10 内核代码树:目录结构与核心模块功能详解
Linux 内核是现代操作系统基础设施中最复杂、最关键的开源项目之一。无论是服务器、云平台、Android 手机、嵌入式设备,还是容器、虚拟化、网络转发、存储系统,其底层都离不开 Linux 内核的支撑。这些目录并不是简单的源码分类,而是 Linux 内核按照职责划分出来的核心子系统。理解这些目录之间的关系,相当于拿到了阅读内核源码的“地图”。
内核版本: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.cTUN/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.c是printk()格式化输出的重要基础。
十三、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 内核代码树就不再是一片迷宫,而是一座结构严密、层次清晰的操作系统工程大厦。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)