《边干边学——LINUX内核指导》
李善平、陈文智 等编著 | 浙江大学出版社 | 2002 年 8 月第 1 版 | 480 页 | 846 千字
一、书籍定位与特色
1.1 定位
浙江大学计算机学院操作系统课程配套的 Linux 内核实验教材,面向本科生和研究生。
1.2 核心特色——“边干边学”
- 不是纯理论讲解,而是通过动手实验、代码实例引导读者深入内核
- 每章都包含”实例”或”实验”环节,从简单到复杂逐步深入
- 强调实践先行:先看现象、写代码,再追溯内核源码理解原理
- 源自浙江大学计算机学院多年的 Linux 内核教学积累
1.3 适用读者
- 有 C 语言基础,想从实践角度入门 Linux 内核的学习者
- 操作系统课程的配套实验用书
- 想从”用 Linux”过渡到”懂 Linux 内核”的程序员
1.4 时代背景
出版于 2002 年,基于 Linux 2.4 内核。虽然内核版本较旧(当前主流为 5.x/6.x),但核心概念和学习方法仍然有效:
- 进程、内存、文件系统、设备驱动等基础概念不变
- 内核模块、系统调用、同步机制的设计思想一致
- “动手实践”的学习方法永不过时
- 适合作为入门读物,之后再读更新的内核书籍(如 《Linux内核设计与实现》-第三版-Robert-Love)
二、全书知识体系(11 章)
全书由李善平、陈文智共同负责,各章节分工明确:
- 李善平编写第 1、2、5、7、9、10 章
- 陈文智编写第 3、4、6、8、11 章
第一篇:入门与基础工具
第 1 章 了解 Linux 内核(P1)
- 1.1 Linux 内核——什么是内核、内核的作用、单内核 vs 微内核
- 1.2 查看 Linux 内核状况——/proc 文件系统、系统信息查看命令
- 1.3 编程序检查系统状况——通过系统调用获取内核信息
- 1.4 Linux 编程环境——GCC、Make、GDB 等工具链
入门思路:先从外部观察内核(/proc、命令),再用程序接触内核(系统调用),最后才深入源码。
第 2 章 shell(P23)
- 2.1 shell——shell 的本质、历史、常见 shell(bash 等)
- 2.2 实现一个简单的 shell 程序——动手写 mini shell,理解进程创建与管道
- 2.3 shell 编程——shell 脚本语法与实践
为什么从 shell 讲起:shell 是用户与内核交互的最直接界面,理解 shell 有助于理解系统调用和进程管理。
第二篇:内核核心机制
第 3 章 内核时钟(P57)
- 3.1 关于时钟和定时器——硬件时钟、软件时钟的基本概念
- 3.2 Linux 系统时钟——jiffies、HZ、时钟中断处理
- 3.3 Linux 系统定时器——定时器内核实现、timer_list 结构
- 3.4 时钟命令介绍——用户空间时钟相关命令
- 3.5 定时器的应用——实例:用定时器实现延时、超时
时钟是操作系统的心跳,所有调度、超时、统计都依赖时钟中断。
第 4 章 内核模块(P95)
- 4.1 概述——什么是内核模块、为什么需要模块、模块的优缺点
- 4.2 模块实现机制——模块加载/卸载、模块参数、符号导出、依赖关系
- 4.3 实例——编写第一个内核模块、带参数的模块、使用导出符号
内核模块是学习内核的最佳入口:可以动态加载/卸载,不用重新编译内核,风险低、反馈快。
第 5 章 系统调用(P133)
- 5.1 一个简单的例子——从用户态系统调用入手
- 5.2 系统调用基础知识——什么是系统调用、为什么需要、调用约定
- 5.3 相关数据结构、源代码分析及流程——sys_call_table、int 0x80(x86 32位)、系统调用入口
- 5.4 详细讲解一个系统调用的实现——以某个典型调用为例深入源码
- 5.5 简单系统调用的添加——动手:向内核添加一个自定义系统调用
- 5.6 较高级主题:添加一个更复杂的系统调用——带参数、有返回值的复杂系统调用
系统调用是用户态与内核态的桥梁。亲手添加一个系统调用,是理解内核边界的最佳方式。
第 6 章 共享内存(P169)
- 6.1 进程间通信和共享内存——IPC 方式概览、共享内存的定位
- 6.2 共享内存的 API——shmget、shmat、shmdt、shmctl
- 6.3 实现共享内存的源代码——内核中共享内存的实现机制
- 6.4 利用共享内存进行进程间通信——实例:两个进程通过共享内存交换数据
共享内存是最快的 IPC 方式,但需要配合同步机制使用。
第 7 章 虚拟存储(P205)
- 7.1 虚拟内存管理——虚拟内存的基本概念、分页、分段、地址转换
- 7.2 Linux 虚拟内存管理——页表、vm_area_struct、缺页中断、物理内存分配(buddy/slab)
- 7.3 实例——动手实验验证虚拟内存机制
虚拟内存是操作系统最核心的抽象之一,也是理解内核的关键。
第 8 章 进程的同步(P241)
- 8.1 同步机制——竞态条件、临界区、互斥与同步的基本概念
- 8.2 Linux 中几种同步机制的实现——原子操作、自旋锁、信号量、读写锁、内核互斥锁
- 8.3 设计我们自己的同步机制——动手:实现一个自定义的同步原语
同步是并发编程的核心,也是内核编程中最容易出 bug 的地方。
第 9 章 进程调度(P301)
- 9.1 进程调度简介——调度的目标、调度的时机
- 9.2 进程调度的策略与算法——FCFS、SJF、优先级、时间片轮转、多级反馈队列
- 9.3 进程调度的实现——Linux 2.4 的调度器实现(基于 goodness 的 O(n) 调度器)
- 9.4 改进进程调度算法的实现——动手:修改调度算法、添加自定义调度策略
调度器决定了 CPU 时间如何分配,是操作系统性能的关键。
第三篇:内核子系统
第 10 章 设备驱动(P337)
- 10.1 Linux 下驱动程序的相关概念——设备分类(字符/块/网络)、驱动的作用
- 10.2 传统的设备管理方式——主设备号、次设备号、设备文件
- 10.3 块设备的请求队列——块设备驱动核心、request 结构、I/O 调度
- 10.4 设备文件系统 devfs——devfs 文件系统(2.4 内核的方案,后被 udev 取代)
- 10.5 驱动程序的框架及实例分析——字符设备驱动完整实例
- 10.6 设计自己的驱动程序——动手:从零写一个简单的设备驱动
设备驱动是内核中代码量最大的部分,也是内核入门的常见方向。
第 11 章 文件系统(P399)
- 11.1 文件和目录——文件的抽象、目录结构
- 11.2 文件系统的框架——Linux 文件系统的整体架构
- 11.3 VFS 文件系统——虚拟文件系统(VFS)的设计、超级块、inode、dentry、file 四大对象
- 11.4 ext2 文件系统——ext2 的磁盘布局、块组、inode 位图、块位图
- 11.5 open、close 和 read、write 操作——系统调用在内核中的完整路径
- 11.6 buffer cache——缓冲区缓存的作用与实现
- 11.7 实验:添加一个文件系统——动手:实现一个简单的自定义文件系统
- 11.8 附录:优秀的日志文件系统——ext3——ext3 日志机制简介
VFS 是 Linux 文件系统的核心抽象,理解 VFS 才能理解一切文件系统。
三、核心学习路径总结
3.1 从外到内的五层递进
用户命令层 → shell/系统调用 → 内核子系统 → 内核源码 → 动手修改
(第1章) (第2-5章) (第6-9章) (源码分析) (各章实验)
3.2 三大核心实验
- 添加系统调用(第 5 章)——理解内核边界
- 编写内核模块(第 4 章)——理解内核扩展机制
- 实现文件系统(第 11 章)——理解 VFS 抽象
3.3 四条主线
| 主线 | 章节 | 关键概念 |
|---|---|---|
| 进程管理 | 第2、8、9章 | 进程创建、同步、调度 |
| 内存管理 | 第7章 | 虚拟内存、页表、缺页中断 |
| 文件系统 | 第11章 | VFS、ext2、buffer cache |
| 设备驱动 | 第10章 | 字符/块设备、devfs |
四、与其他内核书籍的关系
4.1 横向对比
| 书籍 | 侧重点 | 适合阶段 |
|---|---|---|
| 本书 | 实践入门、动手实验 | 入门 |
| 《Linux内核设计与实现》-第三版-Robert-Love | 概念清晰、覆盖面广、讲解精炼 | 入门→进阶 |
| 《LINUX内核源代码情景分析》-毛德操胡希明 | 源码级深度剖析、情景分析 | 进阶→深入 |
| 《Linux设备驱动程序》-第三版-Linux-Device-Drivers-Corbet-Rubini-Kroah-Hartman | 设备驱动专项 | 驱动方向 |
4.2 推荐阅读顺序
- 本书(边干边学)——通过实验建立直觉
- Linux 内核设计与实现——系统掌握概念
- Linux 内核源代码情景分析——深入源码细节
- Linux 设备驱动程序——驱动方向深入
五、注意事项与局限性
- 内核版本较旧:基于 Linux 2.4,与现代 5.x/6.x 内核有较大差异
- 调度器:2.4 是 O(n) 调度器 → 2.6 引入 O(1) → 之后引入 CFS
- 设备模型:2.4 用 devfs → 2.6 之后用 sysfs + udev
- 内存管理:2.4 到现在变化很大(THP、cgroup 等)
- 架构局限:主要基于 x86 32 位
- 作为入门合适:概念和学习方法仍然有效,但深入现代内核需搭配新书
- C 语言基础:阅读本书需要扎实的 C 语言和指针基础
六、关键金句(从前言提炼)
“计算机专业知识需要动手实践,而操作系统的学习实践是浙江大学计算机学院操作系统课程教学需要解答的问题。”
“作者团队在自学 Linux 过程中耗费了大量精力搜集、整理资料,希望将这些经验分享给学习者,帮助大家提升学习效率。”
linux 子目录第 4 个完成的笔记 | 扫描版 PDF,480 页,11 章完整梳理