内容简介
《Linux内核模块开发技术指南》旨在帮助读者快速理解Linux内核,并掌握内核模块开发及性能调优的能力。
本书以Linux 5.10版本内核为蓝本,通过对内核工作原理的阐释与诸多核心模块的动手实现,详细介绍了内核模块相关基础、并发与互斥、系统调用、内核监控与调试、字符和块设备驱动、外部中断、块I/O调度、文件系统、进程调度、网络数据包过滤、安全模块等内容。
本书不仅适合初学者学习Linux内核开发的基础知识,也适合有一定基础的开发者深入学习高级主题和前沿技术。
目录
第1章 第一个内核模块Hello,Linux Kernel 001
1.1 内核模块的程序构成 001
1.1.1 最简单的内核模块 002
1.1.2 许可证协议 004
1.1.3 模块参数 004
1.1.4 模块导出符号 006
1.1.5 模块作者 007
1.1.6 描述信息 008
1.2 打印级别 008
1.3 再谈Hello,Linux Kenel 009
1.4 常用数据结构 011
1.4.1 链表 011
1.4.2 哈希链表 011
1.4.3 红黑树 012
1.4.4 XArray 013
第2章 proc文件 018
2.1 创建proc文件 018
2.2 文件读写 022
2.2.1 数据传递接口 022
2.2.2 实现数据读写 022
2.3 创建目录 024
2.4 通过偏移量读写文件 025
2.5 打开的文件 027
2.6 移动读写位置 029
2.7 目录项和文件节点 032
2.8 I/O控制操作 039
2.9 小结 042
第3章 内核模块开发基础 043
3.1 内核补丁 043
3.1.1 补丁头 043
3.1.2 补丁块 044
3.1.3 创建补丁文件 044
3.1.4 安装补丁文件 045
3.1.5 撤销补丁文件 046
3.2 常用的内存分配和释放接口 046
3.2.1 kmalloc和kfree 047
3.2.2 vmalloc和vfree 048
3.2.3 分配连续的内存页 048
3.2.4 kmem_cache系列函数 048
3.2.5 物理地址和虚拟地址 050
3.2.6 几种内存分配接口的关系 053
3.3 内存映射 054
3.3.1 mmap系统调用 055
3.3.2 proc文件的mmap操作 056
3.4 获取未映射内存区域 059
3.5 散布读 060
3.6 内核线程 064
3.6.1 进程的状态 064
3.6.2 创建内核线程 067
3.6.3 二号进程 069
3.7 工作队列 070
3.8 等待队列 071
3.9 实现wait_event和wake_up 078
3.10 多路复用 082
3.10.1 select系统调用 082
3.10.2 proc文件的poll操作 084
3.11 定时器 086
3.11.1 毫秒级定时器 086
3.11.2 高精度定时器 089
3.12 延时任务 093
第4章 并发与互斥 095
4.1 信号量 096
4.2 互斥体 098
4.3 完成量 099
4.4 原子操作 102
4.4.1 整型原子操作 103
4.4.2 位原子操作 105
4.5 自旋锁 105
4.6 读写锁 108
4.7 RCU 111
4.7.1 原理 111
4.7.2 接口及示例 112
4.8 PER_CPU 114
4.8.1 原理 114
4.8.2 相关接口 115
4.8.3 示例程序 116
4.9 死锁检测 117
第5章 系统调用 120
5.1 执行系统调用 120
5.1.1 系统调用的执行过程 120
5.1.2 系统调用的三种执行方式 121
5.2 C与汇编 123
5.2.1 C语言和汇编语言函数的参数传递 123
5.2.2 内联汇编 127
5.3 增加系统调用 132
5.4 Linux系统调用的实现方式 136
5.5 通过软件中断实现系统调用 138
5.5.1 通过0x80软件中断执行系统调用 138
5.5.2 自己动手实现系统调用 140
第6章 监控与调试 141
6.1 kprobe 141
6.1.1 结构体和相关接口 141
6.1.2 示例程序 142
6.2 kretprobe 145
6.2.1 结构体和相关接口 146
6.2.2 示例程序 147
6.3 uprobe 149
6.3.1 结构体和相关接口 149
6.3.2 示例程序 151
6.4 perf 154
6.5 bpftrace 160
6.6 kdump 163
6.6.1 产生vmcore文件 163
6.6.2 查看vmcore文件 163
6.6.3 crash工具 164
6.6.4 crash分析示例 167
6.7 kgdb 170
第7章 字符设备驱动 175
7.1 最简单的字符设备驱动 175
7.1.1 相关接口 175
7.1.2 示例程序 178
7.2 通过字符设备驱动访问串口 181
7.2.1 串行通信 181
7.2.2 相关寄存器 181
7.2.3 串口接收/发送配置 183
7.2.4 示例程序 183
7.3 通过ioctl操作配置串口参数 188
7.3.1 相关寄存器 188
7.3.2 示例程序 188
第8章 外部中断 191
8.1 基本概念 191
8.2 通过中断读取串口数据 192
8.2.1 相关寄存器 192
8.2.2 相关接口 193
8.2.3 示例程序 194
8.3 中断底半部 197
8.3.1 工作队列 197
8.3.2 tasklet 198
8.3.3 软中断 200
8.4 常用接口 203
第9章 文件操作 206
9.1 虚拟文件系统(VFS) 206
9.1.1 read系统调用的执行过程 207
9.1.2 VFS管理的对象 208
9.2 write_iter操
前言/序言
在当今的数字化时代,操作系统作为计算机系统的基石,承载着连接硬件与软件、用户与程序的关键使命。在一众主流操作系统中,Linux凭借其强大而稳定的性能广泛应用于嵌入式、服务器等领域,其内核的设计思想和实现方式值得每一位开发者、系统架构师和计算机科学爱好者深入研究和学习。
由于Linux内核开发涉及广泛的知识领域,入门难度较高,而资深开发者也面临着日益复杂的系统需求和性能优化挑战,因此,笔者结合自身开发经验,系统地梳理了Linux内核开发所需的知识体系,旨在为读者提供一条清晰高效的学习路径。通过丰富的实践案例,读者可以动手实现相关模块,深入理解其核心原理与技术细节,从而跨越Linux内核模块开发的门槛,独立开发Linux各类内核模块。
全书共分16章,分为三个部分:
第1部分包括第1~2章,主要介绍Linux内核模块的构成以及通过实例完成一些简单的内核模块。
第2部分包括第3~11章,系统地讲解了内核模块开发基础、并发与互斥、系统调用、监控与调试手段以及驱动的基础知识,并通过大量实例深入浅出地说明各个知识点。
第3部分包括第12~16章,其中第12~13章详细介绍了Linux文件系统的构成,并将带领读者动手完成一个完整的文件系统;第14章详细描述了进程调度的相关概念以及进程调度机制,并实现了一个简单的进程调度器;第15章讲解了网络数据包过滤的原理,通过实现各类数据包过滤模块让读者加深印象;第16章介绍了Linux安全模块,并给出具体实例。
由于篇幅所限,本书将部分较为基础性的内容放在了配套电子书中,这些章节包括:基础环境的安装、调试工具的补充说明、常用内核接口及示例、系统调用的实现示例、内核源码解析以及计算机网络基础。读者可扫描封底二维码并关注官方公众号,通过回复关键字“Linux内核模块开发技术指南”获取电子书、源码及相关工具等配书资源的下载链接。
由于作者水平有限,书中难免存在不足之处,望广大读者批评指正。
编著者