Learn Linux Kernel

Learn Linux Kernel

  1. 了解操作系统基本概念。如果不会,可以学习《操作系统:设计与实现》Andrew S.Tanenbaum 写的那本。以MINIX为例子讲解操作系统的概念。非常推荐。
  2. 有了操作系统的基本概念以后,可以了解Linux的机制了。推荐《Linux内核设计与实现》Robert Love 写的。这本书从概念上讲解了Linux有什么,他们是怎么运行的。这本书要反复认真看透。
  3. 有了Linux内核的了解,还需要具体研究Linux内核源码。经典的就是《深入理解Linux内核》Daniel P. Bovet 写的。学习这本书的时候,要对着内核代码看着学。这本书学起来相当费力了,那么多多代码要研究。不过这本书如果学明白了,恭喜你,Linux内核你已经很熟悉了。
  4. 如果要开发设备驱动,可以学习《linux设备驱动程序》O’Reilly出版社的。这本作为驱动的入门是很好的资料。另外还有一本《精通Linux 驱动程序开发》也是不错的教材,可以参考着看。学习驱动,免不了要学习一些硬件的协议和资料,研究哪个就找到相应的硬件文档,把硬件的工作原理搞明白。这些就不细说了。
  5. 网络部分,学些Linux网络部分就学习《深入理解LINUX网络技术内幕》。这本书把Linux的网络部分讲的非常清晰透彻。

更高效的Linux Kernel学习路径建议

1. 基础准备

先决知识
C 语言(指针、内存管理、结构体)。
操作系统基础(进程/线程、虚拟内存、文件系统)。
Linux 基础命令gccgdbmake)。

推荐资源
• 书籍:《Linux Kernel Development》(Robert Love)、《Operating Systems: Three Easy Pieces》。
• 在线课程:CS 140: Operating Systems (Stanford)

2. 内核代码实践

官方源码 + QEMU 调试

# 下载最新内核
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# 编译并运行最小系统
make defconfig
make -j$(nproc)
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -append "console=ttyS0" -nographic

调试技巧
◦ 使用 gdb + QEMU 单步跟踪内核启动:

qemu-system-x86_64 -kernel bzImage -s -S -append "nokaslr"
gdb vmlinux
(gdb) target remote :1234

推荐实验
• 编写一个简单字符设备驱动(参考 samples/char/)。
• 修改进程调度策略(kernel/sched/)。

3. 深度专题学习

核心子系统

子系统 学习重点 代码路径
进程管理 task_struct、调度算法 kernel/sched/
内存管理 页表、SLAB 分配器、缺页异常 mm/
文件系统 VFS、Ext4/Btrfs 实现 fs/
网络栈 TCP/IP 协议栈、Netfilter net/

高级工具
BPF:动态追踪内核(BCC 工具集)。
ftrace:分析函数调用关系:

echo function > /sys/kernel/debug/tracing/current_tracer
cat trace

4. 社区与开源

参与实际开发
• 从修复简单 Bug 开始(标记为 good first issue内核邮件列表)。
• 提交补丁到 Kernel Newbies

推荐项目
Linux Kernel Module Programming Guide(现代版驱动开发指南)。
OSDEV Wiki(自制小型 OS 的实践)。


三、学习路线图

graph LR
A[基础: C语言 + OS原理] --> B[环境: QEMU + GDB]
B --> C[实验: 驱动 + 子系统]
C --> D[进阶: BPF/性能优化]
D --> E[贡献: 内核补丁]

四、总结

linux-kernel-labs 适合快速上手基础实验,但需配合其他资源深化学习。
更推荐的方式

  1. 通过官方源码 + QEMU 调试理解核心机制。
  2. 选择感兴趣的子系统深入阅读代码(如文件系统或网络)。
  3. 用 BPF/ftrace 进行动态分析。
  4. 参与实际开发(哪怕是最小的补丁)。

如果需要具体某个子系统(如内存管理)的学习资源或实验示例,可以进一步探讨!