Linux 内核深入学习路线
1. 📖 前置基础(必须先掌握,否则寸步难行)
在深入内核前,你需要补齐以下基础,也是你之前 Linux 进阶的延伸:
2. 📖 1. 操作系统基础理论(计算机底层)
- 计算机体系结构:CPU 架构(x86_64 为主)、寄存器、内存、总线、中断、IO 模型
- 操作系统核心概念:进程 / 线程、调度、虚拟内存、文件系统、设备驱动、系统调用
- 并发基础:临界区、锁、信号量、竞态条件、死锁
3. 📌 2. C 语言(内核唯一主力语言)
Linux 内核由纯 C 语言 + 少量汇编编写,不会 C 只能停留在 “使用工具” 层面,无法读源码、改内核。 必学 C 知识点:
- 基础语法、指针(重中之重,内核到处是指针)、指针数组、函数指针
- 结构体、联合体、位运算(内核大量使用位掩码)
- 内存管理:栈、堆、静态内存,
malloc/free底层逻辑 - 预处理、宏定义、条件编译(内核宏极多)
- 简单 Makefile 编译基础
运维建议:不用学到高级 C 开发,看懂代码、理解指针和内存模型即可。
4. 📌 3. 汇编语言(了解为主)
- x86/x86_64 基础汇编指令、寄存器作用
- 重点看懂:系统调用入口、中断处理、上下文切换相关汇编,不用手写复杂汇编
5. 📌 4. 已掌握的 Linux 实操能力
- 熟练使用
top/htop/vmstat/iostat/sar/ss/tcpdump/strace/perf等观测工具 - 理解进程、内存、磁盘、网络、权限、启动流程
- 会分析日志、排查 CPU / 内存 / IO / 网络故障
6. 🏗️ ⚡ 第一阶段:内核整体架构 & 启动流程(入门总览,1~2 周)
目标:建立内核全局认知,知道内核由哪些模块组成、系统开机完整链路。
7. 🏗️ 1. Linux 内核整体架构
7.1. 分层模型
- 用户空间:应用程序(Shell、Python、Java、中间件),权限低 Ring3
- 内核空间:Linux 内核本身,权限高 Ring0,所有硬件、核心逻辑都在这里
- 系统调用接口(用户态 ↔ 内核态唯一入口)
- 进程管理子系统
- 内存管理子系统
- 文件系统子系统
- 网络子系统
- 设备驱动子系统
- 中断 & 软中断子系统
7.2. 核心概念
- 内核态 / 用户态 切换:触发场景、开销、系统调用执行流程
- 内核版本规则:主线版、稳定版、长期支持版(LTS),企业常用
3.10/4.19/5.4 - 单内核 vs 微内核:Linux 是单内核,所有子系统运行在同一地址空间,效率高
8. 🎯 2. Linux 完整启动流程(从上电到应用启动)
逐阶段拆解,结合实际故障排查:
- 硬件上电 → BIOS/UEFI 初始化硬件
- GRUB 引导加载器:加载内核镜像
vmlinuz、临时根文件系统initramfs - 内核解压、初始化内核各子系统(内存、中断、驱动、调度器)
- 挂载真实根文件系统
- 启动
systemd(CentOS7+)/init(CentOS6),拉起系统服务、终端、应用
8.1. 配套实操
- 查看内核镜像、initramfs:
ls /boot - 查看内核启动日志:
dmesg、journalctl -k - 分析开机耗时:
systemd-analyze
9. 🔧 第二阶段:内核核心子系统(重中之重,运维 / 排障核心,4~8 周)
这是运维工程师深入内核的核心板块,也是性能调优、疑难故障(D 状态进程、CPU 高、内存泄漏、网络卡顿、IO 阻塞)的根源。 按优先级排序,每个子系统包含:原理 + 内核参数 + 观测工具 + 故障场景。
10. 📌 ⏰ 子系统 1:进程管理 & 调度器(最高频)
10.1. . 基础概念
- 进程、线程、轻量级进程(LWP)、线程组
- 进程描述符
task_struct(内核管理进程的核心结构体) - 进程状态:
R/S/D/T/Z/I内核态真实含义(重点 D 不可中断睡眠 排障) - 孤儿进程、僵尸进程、守护进程、内核线程
10.2. . 进程调度
- 调度器发展:O (1) 调度器 → CFS 完全公平调度器(现代 Linux 默认)
- 调度策略:
- 普通分时策略
SCHED_OTHER(绝大多数业务进程) - 实时调度
SCHED_FIFO/SCHED_RR(内核、高优先级服务)
- 普通分时策略
- 优先级:静态优先级、动态优先级、nice 值、实时优先级
- 时间片、上下文切换(CPU 上下文切换过高是经典性能问题)
10.3. . 中断 & 软中断 & 硬中断
- 硬中断(IRQ):硬件触发(网卡、磁盘、键盘),处理快、不可嵌套
- 软中断:中断下半部,延迟处理耗时逻辑(网络收包、磁盘 IO 大量依赖软中断)
- 中断队列、中断均衡、CPU 中断飙高排查
10.4. . 工具 & 内核参数 & 故障
观测工具
top、htop、ps、pstree、pidstat、mpstat、vmstat、watch -d、strace(跟踪系统调用)、pstack(栈分析)
常见故障
- CPU 整体负载高、用户态 / 内核态 CPU 占比异常
- 上下文切换(
cs)频繁、中断(in)过高 - 大量 D 状态进程(IO 阻塞、内核死锁)
- 僵尸进程堆积 内核参数 进程最大数、线程数限制、调度相关内核调优参数。
11. 🧠 子系统 2:内存管理(虚拟内存,第二核心)
结合你之前学的物理内存、Swap、OOM,向内核底层深挖。
11.1. . 虚拟内存原理(Linux 内存核心)
- 虚拟地址空间 vs 物理地址空间
- 分页机制、页表、页框、MMU 内存管理单元
- 地址翻译全过程(虚拟地址 → 页表 → 物理内存)
- 内存隔离:每个进程拥有独立虚拟地址空间,互不干扰
11.2. . 内核内存布局
- 用户空间地址分布:代码段、数据段、BSS、堆、栈、共享库
- 内核空间地址布局:线性映射、vmalloc 动态内存、高端内存(老版本)
11.3. . 页缓存 & Buffer & 脏页
- 页缓存(Page Cache)实现原理、回收机制
- 脏页回写机制、pdflush 内核线程
- 内存水位:最小空闲水位、内存紧张触发回收的逻辑
11.4. . Swap 交换机制(底层)
- 页换出、页换入完整流程
swappiness内核参数底层逻辑- 交换分区缓存、预读机制
11.5. . OOM Killer 内存溢出
- OOM 打分算法、选择被杀进程逻辑
- OOM 日志内核态输出、cgroup 内存限制下的 OOM
11.6. . 内存泄漏 & 内核内存泄漏
- 用户态内存泄漏:堆内存未释放
- 内核内存泄漏:
slab内存占用持续上涨(运维高阶故障) - SLUB/SLUB 内存分配器(内核小内存管理)
11.7. . 工具 & 故障
观测工具
free、vmstat、sar -r、slabtop(查看内核 SLAB 缓存)、valgrind(应用内存泄漏)、echo /proc/pid/maps(进程地址空间)
典型故障
- 物理内存持续上涨、无法释放
- SLAB 占用过高、内核内存泄漏
- 频繁 Swap 换入换出、业务卡顿
- 突发 OOM 杀死进程
12. 💾 子系统 3:文件系统 & 块设备 IO
12.1. . 虚拟文件系统 VFS(Linux 设计精髓)
- VFS 抽象层:统一接口,兼容 ext4/xfs/nfs/tmpfs 等不同文件系统
- 四大核心对象:超级块、索引节点 inode、目录项 dentry、文件对象
12.2. . 主流本地文件系统
- ext4:日志文件系统、日志模式、碎片、预分配
- XFS:CentOS7+ 默认,大文件、大分区优化、日志机制
- tmpfs:内存文件系统(/dev/shm)
12.3. . Inode & 硬链接 & 软链接
- inode 结构、文件元数据、inode 耗尽故障(常见线上问题)
- 目录项缓存(dentry cache)
12.4. . 块设备 & IO 调度
- 块设备、通用块层、IO 队列
- IO 调度器:
noop/mq-deadline/mq-kyber适用场景(SSD / 机械盘区别) - 同步 IO、异步 IO、Direct IO(绕过页缓存,数据库常用)
12.5. . 日志轮转、文件锁、权限底层实现
12.6. 工具 & 故障
iostat、iotop、blktrace(内核 IO 追踪)、df -i(查看 inode)
故障:磁盘 IO 100%、IO 延迟高、inode 耗尽、文件无法删除、磁盘卡死。
13. 🌐 子系统 4:网络子系统(网络排障终极底层)
结合你学的 TCP/IP、Socket、粘包拆包、连接状态,深入内核网络协议栈。
13.1. . Linux 网络协议栈分层
应用层 Socket → 套接字层 → 网络协议层(IP/TCP/UDP)→ 网络设备层 → 网卡驱动
13.2. . Socket 内核实现
- Socket 本质:内核中的特殊文件
- 文件描述符 fd 与 Socket 关系、最大文件句柄数限制
13.3. . TCP 内核深度(运维必学)
- TCP 三次握手 / 四次挥手内核流程
- 半连接队列(syn queue)、全连接队列(accept queue)溢出问题
- TCP 连接状态完整流转:
LISTEN/SYN_RECV/ESTABLISHED/TIME_WAIT/CLOSE_WAIT - TIME_WAIT 状态作用、回收机制、内核参数调优
- CLOSE_WAIT 大量堆积根因(应用不调用 close)
- TCP 滑动窗口、拥塞控制、重传、Nagle 算法、延迟 ACK
13.4. . 网络收包 / 发包全流程
- 网卡中断 → 软中断(
ksoftirqd)→ 协议栈处理 → 应用读取 - 多队列网卡、RSS 网卡多队列(多核 CPU 网络负载均衡)
13.5. . 防火墙 netfilter/iptables 内核框架
- netfilter 五个钩子点(PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING)
- iptables 规则在内核中的执行逻辑
13.6. . 工具 & 故障
观测工具
ss、netstat、tcpdump、wireshark、nstat、sysctl 网络参数
典型故障
- 端口无法监听、连接队列溢出
- 大量 TIME_WAIT / CLOSE_WAIT
- 网络丢包、延迟高、软中断 CPU 占满
- 防火墙规则导致访问异常
14. 📖 子系统 5:系统调用 & 内核调试基础
14.1. . 系统调用
- 定义:用户态进程进入内核态执行内核功能的唯一接口
- 常用系统调用:
open/read/write/connect/socket/fork/exec - 执行流程:触发中断 → 内核处理 → 返回用户态
14.2. . strace 使用(运维神器)
跟踪进程所有系统调用、参数、返回值,定位应用卡死、文件打不开、网络连不上的终极工具。
15. 🔧 第三阶段:内核观测 & 性能分析工具栈(运维落地核心)
学完子系统理论,必须用工具验证、排障、调优,这是理论落地的关键。 分为:通用监控、CPU、内存、IO、网络、跟踪调试六大类。
16. 📊 1. 综合监控
top/htop:进程全局状态uptime:系统负载vmstat:CPU、内存、IO、中断、上下文切换综合统计sar:全能时序监控,可回看历史性能数据dstat:实时多维度统计
17. 🔍 2. CPU 分析
mpstat:单 CPU 核心状态、中断pidstat:单个进程 CPU、线程、上下文切换perf(Linux 官方性能剖析工具,内核级神器)- 采样 CPU 热点函数、追查 CPU 高占用根因
- 查看内核 / 应用调用栈、软中断、调度问题
18. 🔍 3. 内存分析
slabtop:内核 SLAB 内存分配统计cat /proc/meminfo:完整内核内存信息valgrind:应用内存泄漏检测
19. 🔍 4. 磁盘 IO 分析
iostat、iotopblktrace:内核 IO 请求追踪
20. 🔍 5. 网络分析
ss/netstat:连接状态tcpdump:抓包ethtool:网卡硬件、中断、RSS 队列配置
21. 🔍 6. 跟踪 & 调试
strace:系统调用跟踪ltrace:库函数调用跟踪gdb + kgdb:内核源码调试(进阶)
学习建议:每学一个子系统,立刻用对应工具观测内核行为。
22. 📌 ⚙️ 第四阶段:内核源码阅读(进阶,偏深度研发 / 高级运维)
如果想从 “会用” 走到 “看懂原理、改代码、写内核模块”,开始阅读源码。
23. 📌 1. 环境准备
-
下载内核源码:推荐长期稳定版
3.10(CentOS7)、4.19、5.4yum install kernel-devel # 对应系统内核源码头文件 -
阅读工具:VS Code + 源码索引(cscope/ctags)
-
编译环境:
gcc、make、依赖库
24. 🏗️ 2. 源码目录结构(重点目录)
arch/ :架构相关代码(x86_64 重点)
kernel/ :进程、调度、系统调用、中断核心代码
mm/ :内存管理(虚拟内存、SLAB、Swap)
fs/ :文件系统、VFS
net/ :网络协议栈、TCP/IP、socket
drivers/ :设备驱动(网卡、磁盘、外设)
include/ :头文件、结构体、宏定义
init/ :内核启动初始化代码
ipc/ :进程间通信
25. 📌 3. 源码阅读顺序(由浅入深)
- 内核启动流程:
init/main.c - 系统调用实现:
sys_xxx函数 - 进程管理:
task_struct、调度器代码 - 内存管理:页分配、SLAB、回收逻辑
- 文件系统 VFS 层
- TCP/IP 网络协议栈
26. 📌 4. 简单内核模块开发(入门实验)
编写简易内核模块(Hello World)、加载 / 卸载模块:
insmod / rmmod / lsmod
理解:内核模块、动态加载、符号导出,是驱动开发入门。
27. 🚀 第五阶段:内核调优 & 疑难故障实战(运维终极目标)
结合前面所有知识,形成系统化调优 + 排障能力,也是大厂高级运维、SRE 核心考点。
28. ⚙️ ⚙️ 1. 内核参数调优体系
所有调优参数都要理解底层原理,拒绝网上复制粘贴。
文件:/etc/sysctl.conf
28.1. (1)内存类
vm.swappiness、vm.dirty_*脏页参数- 内存水位、页回收参数
- OOM 相关配置
28.2. (2)文件句柄 & 进程限制
file-max系统全局最大文件句柄ulimit用户级句柄、进程数限制
28.3. (3)网络类(高并发服务必备)
- TCP 连接队列、半连接队列
- TIME_WAIT 回收、端口范围
- 网卡软中断、RSS 队列调优
- TCP 拥塞、重传、滑动窗口参数
28.4. (4)进程调度类
调度器、线程相关参数
29. 🔍 2. 经典内核级故障实战(逐个复现排查)
- 大量 D 状态进程(不可中断阻塞)
- 内核 SLAB 内存泄漏
- 软中断 CPU 占满
- TCP 全连接 / 半连接队列溢出
- 大量 CLOSE_WAIT / TIME_WAIT 导致端口耗尽
- 频繁 OOM 被杀进程
- 磁盘 IO 队列拥塞、业务卡死
- 僵尸进程无法回收
30. 🌐 分阶段学习周期 & 学习路线总览
31. 🎯 路线一:运维 / SRE 方向(推荐,以排障、调优、工具使用为主)
- 前置:C 语言基础 + 操作系统理论(1~2 周)
- 阶段 1:内核整体架构 + 启动流程(1~2 周)
- 阶段 2:四大核心子系统(进程 / 内存 / 文件 IO / 网络)(6~8 周)
- 阶段 3:内核工具栈(strace/perf/slabtop/blktrace)实操(2~3 周)
- 阶段 4:内核参数调优 + 线上故障复盘(长期练习)
目标:看懂内核行为、定位根因、做生产调优、解决疑难线上问题。
32. 📌 路线二:内核开发 / 驱动方向(偏研发)
在路线一基础上增加:
- 内核源码精读(2~4 个月)
- 内核模块、驱动开发、调试(kgdb)
- 内核补丁、编译自定义内核
33. 💾 优质学习资源(书籍 + 文档 + 社区)
34. 📖 经典书籍(按优先级)
34.1. 入门 & 运维向
- 《Linux 内核设计与实现》(必看,薄而精,运维首选) 讲解内核架构、子系统原理,不堆砌复杂源码,适合入门。
- 《Linux 性能优化权威指南》 内核 + 应用全链路性能调优、故障排查,运维实战圣经。
- 《深入 Linux 内核架构》 内容更深,子系统讲解全面,进阶使用。
34.2. 源码 & 开发向
- 《Linux 内核源码剖析》
- 《Linux 设备驱动程序》(LDD) 驱动经典
- 《深入理解 Linux 虚拟内存管理》 内存专题
35. 📌 ⚡ 在线文档 & 官方资料
- Linux 内核官方文档:
https://www.kernel.org/doc/html/(最权威) - Linux man 手册、
/proc文件系统文档 - RedHat/CentOS 官方内核调优文档(企业生产参考)
36. 🔧 实验环境
- 虚拟机:CentOS7/8、Ubuntu,多版本内核切换练习
- 推荐内核版本:先学 3.10(CentOS7)(企业存量最多),再学 4.19/5.4
37. 🔒 学习避坑建议(针对运维人群)
- 不要一上来就啃海量源码 运维优先「原理 + 工具 + 排障」,源码作为辅助理解,否则极易劝退。
- 所有知识点必须上机验证
内核抽象,只看书完全没用,一定要用
dmesg/strace/perf观测现象。 - 结合你现有的业务场景 你维护 Kafka、MySQL、Python 服务,重点深挖网络、内存、IO、进程调度四大块。
- 调优绝不盲目抄参数
每个
sysctl参数都要搞懂:它在内核做了什么、影响什么场景。 - 循序渐进:基础 Linux → 内核子系统 → 工具 → 调优排障 → 源码。
38. 📊 极简学习清单(速记版)
- 补齐 C 语言 + 操作系统理论(前置)
- 掌握内核整体架构、用户态 / 内核态、启动流程
- 吃透四大核心子系统:进程调度、虚拟内存、文件系统、网络协议栈
- 精通内核观测工具:
strace、perf、vmstat、iostat、ss、tcpdump - 理解全套内核可调参数,掌握调优逻辑
- 复现并解决各类内核级线上故障
- (可选)阅读源码、编写简单内核模块
关联文档
- Linux 内核学习:内核基础
- Linux 用户态与内核态完整详解:用户态/内核态
