微信扫码下载

编辑推荐

1.原理+基础,从调试Linux内核到动手编写一个简单的内核模块,真正从零开始学习Linux内核。
2.实验+案例,70余个创新实验贯穿《奔跑吧 Linux内核 入门篇》,与你分享业内一线项目经验。
3.课件+视频,教学资源丰富,视频讲解透彻,与你共享精品在线配套资源(可在异步社区下载)。
4.涵盖当前Linux社区中新的开发工具和社区运作方式,反映Linux内核社区新发展。

内容简介

奔跑吧 Linux内核 入门篇》是一本介绍Linux内核实践的入门书,基于Linux4.0内核,重点讲解Linux内核的理论和实验。《奔跑吧 Linux内核 入门篇》分为12章,包括Linux系统入门、Linux内核基础知识、内核编译和调试、内核模块、简单的字符设备驱动、系统调用、内存管理、进程管理、同步管理、中断管理、调试和性能优化,以及如何参与开源社区等内容。此外,《奔跑吧 Linux内核 入门篇》还介绍了Linux内核社区常用的开发工具和理论,如Vim8和git工具等。书中包括70多个实验,帮助读者深入理解Linux内核。

作者简介

张天飞,笔名“笨叔叔”,Linux内核爱好者,从事Linux内核和驱动开发十余年,曾在多家芯片公司从事过手机芯片底层软件开发和客户支持工作。著有《奔跑吧Linux内核》一书。

目录

第1章Linux系统入门1
1.1Linux的发展历史1
1.2Linux发行版2
1.2.1RedHatLinux2
1.2.2DebianLinux3
1.2.3SuSELinux4
1.2.4优麒麟Linux4
1.3Linux内核5
1.3.1宏内核和微内核5
1.3.2Linux内核概貌6
1.4如何学习Linux内核9
1.5Linux内核实验入门10
1.5.1实验1:在虚拟机中安装优麒麟Linux18.04系统10
1.5.2实验2:给优麒麟Linux系统更换“心脏”14
1.5.3实验3:使用定制的内核runninglinuxkernel15
1.5.4实验4:如何编译和运行一个ARMLinux内核19
第2章Linux内核基础知识22
2.1Linux常用的编译工具22
2.1.1GCC工具22
2.1.2ARMGCC23
2.1.3GCC编译24
2.2Linux内核中常用的C语言技巧25
2.3Linux内核中常用的数据结构和算法31
2.3.1链表31
2.3.2红黑树34
2.3.3无锁环形缓冲区36
2.4Vim工具的使用38
2.4.1Vim8介绍38
2.4.2Vim的基本模式38
2.4.3Vim中3种模式的切换39
2.4.4Vim光标的移动40
2.4.5删除、复制和粘贴41
2.4.6查找和替换41
2.4.7文件相关41
2.5git工具的使用42
2.5.1安装git43
2.5.2git基本操作43
2.5.3分支管理46
2.6实验48
2.6.1实验1:GCC编译48
2.6.2实验2:内核链表51
2.6.3实验3:红黑树52
2.6.4实验4:使用Vim工具52
2.6.5实验5:把Vim打造成一个强大的IDE编辑工具52
2.6.6实验6:建立一个git本地仓库60
2.6.7实验7:解决合并分支冲突62
2.6.8实验8:利用git来管理Linux内核开发65
2.6.9实验9:利用git来管理项目代码67
第3章内核编译和调试73
3.1内核配置73
3.1.1内核配置工具73
3.1.2.config文件74
3.2实验1:通过QEMU调试ARMLinux内核76
3.3实验2:通过QEMU调试ARMv8的Linux内核78
3.4实验3:通过Eclipse+QEMU单步调试内核81
3.5实验4:在QEMU中添加文件系统的支持85
第4章内核模块86
4.1从一个内核模块开始86
4.2模块参数90
4.3符号共享92
4.4实验93
4.4.1实验1:编写一个简单的内核模块93
4.4.2实验2:向内核模块传递参数95
4.4.3实验3:在模块之间导出符号95
第5章简单的字符设备驱动96
5.1实验1:从一个简单的字符设备开始97
5.2字符设备驱动详解102
5.2.1字符设备驱动的抽象102
5.2.2设备号的管理104
5.2.3设备节点104
5.2.4字符设备操作方法集105
5.3实验2:使用misc机制来创建设备107
5.4一个简单的虚拟设备109
5.4.1实验3:为虚拟设备编写驱动109
5.4.2实验4:使用KFIFO改进设备驱动112
5.5阻塞IO和非阻塞IO115
5.5.1实验5:把虚拟设备驱动改成非阻塞模式115
5.5.2实验6:把虚拟设备驱动改成阻塞模式118
5.6IO多路复用122
5.6.1Linux的IO多路复用122
5.6.2实验7:向虚拟设备中添加IO多路复用支持123
5.7实验8:为什么不能唤醒读写进程128
5.8实验9:向虚拟设备中添加异步通知129
5.9本章小结133
第6章系统调用134
6.1系统调用概念134
6.1.1系统调用和POSIX标准135
6.1.2系统调用表135
6.1.3用程序访问系统调用136
6.1.4新增系统调用137
6.2实验137
6.2.1实验1:在ARM32机器上新增一个系统调用137
6.2.2实验2:在优麒麟Linux机器上新增一个系统调用138

第7章内存管理139
7.1从硬件角度看内存管理139
7.1.1内存管理的“远古时代”139
7.1.2分段机制141
7.1.3分页机制142
7.1.4虚拟地址到物理地址的转换143
7.2从软件角度看内存管理144
7.2.1free命令144
7.2.2从应用编程角度看内存管理145
7.2.3从内存布局图角度看内存管理146
7.2.4从进程角度看内存管理150
7.3物理内存管理154
7.3.1物理页面155
7.3.2内存管理区159
7.3.3分配和释放页面162
7.3.4分配小块内存170
7.4虚拟内存管理177
7.4.1进程地址空间177
7.4.2内存描述符mm_struct178
7.4.3VMA管理180
7.4.4malloc分配函数183
7.4.5mmap185
7.5缺页异常188
7.5.1do_page_fault函数189
7.5.2匿名页面缺页异常190
7.5.3文件映射缺页中断190
7.5.4写时复制缺页异常191
7.5.5缺页异常小结192
7.6内存短缺193
7.6.1页面回收算法193
7.6.2OOMKiller机制194
7.7内存管理实验195
7.7.1实验1:查看系统内存信息195
7.7.2实验2:获取系统的物理内存信息197
7.7.3实验3:分配内存199
7.7.4实验4:slab200
7.7.5实验5:VMA201
7.7.6实验6:mmap203
7.7.7实验7:映射用户内存203
7.7.8实验8:OOM204
第8章进程管理205
8.1进程205
8.1.1进程的来由205
8.1.2进程描述符207
8.1.3进程的生命周期209
8.1.4进程标识212
8.1.5进程间的家族关系212
8.1.6获取当前进程214
8.2进程的创建和终止216
8.2.1写时复制技术216
8.2.2fork()函数217
8.2.3vfork()函数218
8.2.4clone()函数218
8.2.5内核线程219
8.2.6do_fork()函数219
8.2.7终止进程221
8.2.8僵尸进程和托孤进程222
8.2.9进程0和进程1222
8.3进程调度223
8.3.1进程分类224
8.3.2进程优先级224
8.3.3时间片225
8.3.4经典调度算法225
8.3.5LinuxO(n)调度算法228
8.3.6LinuxO(1)调度算法228
8.3.7LinuxCFS调度算法228
8.3.8进程切换233
8.3.9与调度相关的数据结构239
8.4多核调度241
8.4.1调度域和调度组241
8.4.2负载计算244
8.4.3负载均衡算法245
8.5实验246
8.5.1实验1:fork和clone246
8.5.2实验2:内核线程247
8.5.3实验3:后台守护进程247
8.5.4实验4:进程权限247
8.5.5实验5:设置优先级247
8.5.6实验6:per-cpu变量248
第9章同步管理250
9.1原子操作与内存屏障251
9.1.1原子操作251
9.1.2内存屏障253
9.2自旋锁机制254
9.2.1自旋锁定义254
9.2.2自旋锁变种256
9.2.3自旋锁和raw_spin_lock257
9.2.4自旋锁的改进257
9.3信号量258
9.4互斥体259
9.5读写锁261
9.5.1读写锁定义261
9.5.2读写信号量262
9.6RCU264
9.7等待队列267
9.7.1等待队列头267
9.7.2等待队列节点268
9.8实验269
9.8.1实验1:自旋锁269
9.8.2实验2:互斥锁269
9.8.3实验3:RCU269
第10章中断管理270
10.1Linux中断管理机制270
10.1.1ARM中断控制器271
10.1.2硬件中断号和Linux中断号的映射275
10.1.3注册中断276
10.2软中断和tasklet278
10.2.1SoftIRQ软中断279
10.2.2tasklet280
10.2.3local_bh_disablelocal_bh_enable281
10.2.4本节小结282
10.3工作队列机制282
10.3.1工作队列类型283
10.3.2使用工作队列285
10.3.3本节小结285
10.4实验286
10.4.1实验1:tasklet286
10.4.2实验2:工作队列286
10.4.3实验3:定时器和内核线程287
第11章调试和性能优化288
11.1printk和动态输出289
11.1.1printk输出函数289
11.1.2动态输出290
11.1.3实验1:printk292
11.1.4实验2:动态输出292
11.2proc和debugfs293
11.2.1proc文件系统293
11.2.2sys文件系统295
11.2.3debugfs296
11.2.4实验3:procfs297
11.2.5实验4:sysfs298
11.2.6实验5:debugfs300
11.3ftrace301
11.3.1irqs跟踪器302
11.3.2preemptoff跟踪器304
11.3.3preemptirqsoff跟踪器305
11.3.4function跟踪器306
11.3.5动态ftrace307
11.3.6事件跟踪308
11.3.7实验6:使用frace310
11.3.8实验7:添加一个新的跟踪点311
11.3.9实验8:使用示踪标志314
11.3.10实验9:使用kernelshark来分析数据317
11.4实验10:分析oops错误319
11.5perf性能分析工具323
11.5.1实验11:使用perf工具来进行性能分析328
11.5.2实验12:采集perf数据生成火焰图329
11.6内存检测329
11.6.1实验13:使用slub_debug检查内存泄漏330
11.6.2实验14:使用kmemleak检查内存泄漏335
11.6.3实验15:使用kasan检查内存泄漏337
11.6.4实验16:使用valgrind检查内存泄漏340
11.7实验17:kdump342
11.8性能和测试348
11.8.1性能测试概述348
11.8.2实验18:使用lkp-tests工具进行性能测试349
第12章开源社区350
12.1什么是开源社区350
12.1.1开源软件的发展历史350
12.1.2Linux基金会351
12.1.3开源协议351
12.1.4Linux内核社区353
12.1.5国内开源社区354
12.2参与开源社区354
12.2.1参与开源项目的好处354
12.2.2如何参与开源项目355
12.3实验1:使用cppcheck检查代码356
12.4实验2:提交第一个Linux内核补丁357
12.5实验3:管理和提交多个补丁组成的补丁集359
12.6实验4:在Gitee中创建一个开源项目363
参考文献366

其他推荐