LINUX内核源代码情景分析 - 李强
基本信息
- 原书: 《LINUX内核源代码情景分析》
- 作者: 李强
- 云盘路径: /books/linux/LINUX内核源代码情景分析.pdf
- 文件大小: 12.93 MB
- 页数: 1069页(正文)
- 处理日期: 2026-09-03
- 处理方法: PDF文本提取
核心观点
本书以源码情景分析的独特方式,深入剖析Linux内核(2.4.x版本)的关键模块。与一般内核书籍不同,本书不是抽象地介绍概念,而是通过阅读和分析实际的内核源代码来理解Linux的工作原理。每一章都从具体的代码片段出发,追踪函数调用链,揭示内核设计的精妙之处。
内容结构
第1章 预备知识
- 1.1 Linux内核简介:Linux的起源(从Minix到GNU再到Linux)、内核版本策略、发行版概念
- 1.2 Intel X86 CPU系列的寻址方式:实模式→保护模式→线性地址→物理地址的转换,段描述符表(GDT/LDT),段选择子结构
- 1.3 i386的页式内存管理机制:页目录(Page Directory)、页表(Page Table)、页表项(PTE)的结构和用法,CR3寄存器
- 1.4 Linux内核源代码中的C语言代码:内核C代码风格、宏定义、内联函数
- 1.5 Linux内核代码中的汇编语言代码:GCC内联汇编语法、system.h中的关键汇编宏
第2章 存储管理
- 2.1 Linux内存管理的基本框架:内存区域(vm_area_struct)、VMA链表、红黑树管理
- 2.2 地址映射的全过程:虚拟地址→线性地址→物理地址的完整映射路径
- 2.3 几个重要的数据结构和函数:task_struct中的mm/active_mm、mm_struct、page_struct
- 2.4 越界访问:页面错误处理、SIGSEGV信号的生成
- 2.5 用户堆栈的扩展:-grow_stack()函数,动态堆栈扩展机制
- 2.6 物理页面的使用和周转:空闲页框管理、页框分配器
- 2.7 物理页面的分配:alloc_pages()、__get_free_page()等分配函数
- 2.8 页面的定期换出:老化算法(aging algorithm)、页框回收
- 2.9 页面的换入:页面置换策略、swap空间管理
- 2.10 内核缓冲区的管理:Buffer Head、块设备缓存
- 2.11 外部设备存储空间的地址映射:内存映射I/O
- 2.12 系统调用brk():堆内存管理
- 2.13 系统调用mmap():内存映射文件
第3章 中断、异常和系统调用
- X86 CPU对中断的硬件支持:中断描述符表(IDT)、门描述符类型(中断门/陷阱门/任务门)
- 3.2 中断向量表IDT的初始化:idt_table数组、set_gate()宏
- 3.3 中断请求队列的初始化:hardirq_vec数组
- 3.4 中断的响应和服务:ISR入口、save_all、restore_all
- 3.5 软中断与Bottom Half:上半部与下半部的划分、softirq、tasklet机制
- 3.6 页面异常的进入和返回:page fault处理流程
- 3.7 时钟中断:timer interrupt、jiffies、内核定时器
- 3.8 系统调用:int 0x80、系统调用表、sys_call_table
- 3.9 系统调用号与跳转表:nr_system_calls、syscall.h
第4章 进程与进程调度 ⭐重点
- 4.1 进程四要素:PCB(task_struct)、地址空间、栈、CPU状态
- 4.2 进程三部曲:创建、执行与消亡
- 4.3 系统调用fork()、vfork()、clone():copy_process()的完整流程
- 4.4 系统调用execve():加载可执行文件、替换进程地址空间
- 4.5 系统调用exit()与wait4():进程终止、僵尸状态
- 4.6 进程的调度与切换:switch_to()宏的精妙实现、schedule()函数、CFS调度器前身(O(1)调度器)
- 4.7 强制性调度:need_resched标志、preempt_count
- 4.8 系统调用nanosleep()与pause()
- 4.9 内核中的互斥操作:自旋锁(spinlock)、信号量(semaphore)
第5章 文件系统
- 5.1 概述:VFS(虚拟文件系统)、super_block、inode、dentry、file
- 5.2 从路径名到目标节点:path_lookup()、dcache缓存
- 5.3 访问权限与文件安全性:rwx权限、ACL
- 5.4 文件系统的安装和拆卸:mount()/umount()
- 5.5 文件的打开与关闭:sys_open()、file结构和fdtable
- 5.6 文件的写与读:generic_file_read()、generic_file_write()
- 5.7 其他文件操作:truncate、sync、ioctl
- 5.8 特殊文件系统/proc:proc文件系统的设计和意义
第6章 传统的Unix进程间通信
- 6.1 概述:IPC的分类
- 6.2 管道和系统调用pipe():匿名管道、fifo
- 6.3 命名管道
- 6.4 信号:signal()、sigaction()、信号处理流程
- 6.5 系统调用ptrace()和进程跟踪:调试接口
- 6.6 报文传递:消息队列
- 6.7 共享内存
- 6.8 信号量
第7章 基于socket的进程间通信
- 7.1-7.9:完整的socket API实现分析,包括socket()/bind()/listen()/accept()/connect()/send()/recv()/close()
第8章 设备驱动
- 8.1 概述:字符设备、块设备、设备号
- 8.2 系统调用mknod:创建设备文件
- 8.3 可安装模块:module_init/module_exit、insmod
- 8.4 PCI总线:PCI配置空间、plug and play
- 8.5 块设备驱动:request队列、电梯算法
- 8.6 字符设备驱动概述:file_operations结构
- 8.7 终端设备与汉字信息处理
- 8.8 控制台的驱动
- 8.9 USB:通用串行总线
第9章 多处理器的SMP系统结构
- 9.1 概述:SMP vs UP
- 9.2 SMP结构中的互斥问题:smp_lock、Per-CPU变量
- 9.3 高速缓存与内存的一致性:cache coherence、barrier指令
- 9.4 SMP结构中的中断机制:中断affinity
- 9.5 SMP结构中的进程调度:load_balance()
- 9.6 SMP系统的引导:smp_init()
第10章 系统的引导和初始化
- 10.1 系统引导过程概述:BIOS→bootloader→kernel
- 10.2 系统初始化第一阶段:setup_arch()、init_memory_mapping()
- 10.3 系统初始化第二阶段:rest_init()、kernel_init()
- 10.4 系统初始化第三阶段:do_basic_setup()
- 10.5 系统的关闭和重引导
关键知识点
1. 内存管理模式
- Linux使用两级页表(页目录+页表)实现虚拟内存
- CR3寄存器指向当前进程的页目录基地址
- 每个进程有独立的地址空间(mm_struct)
2. 进程调度核心
- O(1)调度器(Linux 2.6引入的前身):用两个就绪队列(active/expired)实现O(1)时间复杂度的调度
switch_to()宏通过操作栈指针实现上下文切换,是Linux内核最精妙的代码之一task_struct是进程的唯一标识,包含进程的所有状态信息
3. 中断处理
- 硬件中断→ISR(上半部)→软中断/Tasklet(下半部)的分层处理
- 中断屏蔽:local_irq_disable()保存并禁用本地CPU中断
4. VFS抽象层
- 虚拟文件系统(VFS)提供了统一的文件系统接口
- super_block(超级块)、inode(索引节点)、dentry(目录项)、file(文件实例)四大核心数据结构
与其他知识的关联
- C++-Concurrency-in-Action-中文版-第361次运行:并发设计模式与内核锁机制可对照理解
- Structured-Computer-Organization-6th-Edition:CPU寻址方式章节可对照阅读
- SICP-计算机程序的构造和解释-Harold-Abelson:操作系统概念与SICP的抽象层次相呼应
可行动点
- 对照2.4.x内核源码(如linux-2.4.18)阅读本书,追踪关键函数调用链
- 重点精读第4章(进程调度)和第2章(存储管理),这是理解内核的核心
- 对于现代内核(5.x/6.x),注意调度器已从O(1)演进为CFS(完全公平调度器)
备注
- 本书基于Linux 2.4.x内核源码,部分机制在现代内核(5.x/6.x)中已有变化
- 书中大量使用源码上下文(显示函数代码片段)来分析行为,这是本书最大的特色
- 适合有一定C语言基础和操作系统概念的读者深入理解Linux内核