课程概要:
这是一个全方位覆盖 Linux 开发工具、内核与驱动、系统编程和系统调优的七日训练营。它首先讲解 Linux 的系统架构和开发工具,之后逐步过渡到内核的进程调度、内存管理、 I/O和驱动等,接下来往系统调用层面和上层系统编程走,讲解在 Linux 内如何开发高性能的多进程、多线程程序,以及如何设计好程序的架构、规划好 I/O 模型,最后讲解 Linux 的一些性能剖析。
工具,找到性能瓶颈,涉及到对 ftrace、perf、 eBPF/BCC、 getdelays、火焰图等工具的讲解。
本课程将辅以大量的实验与示例加深对各个知识点得理解,并提供相应的实验环境和示例代码供课上课下练习。
课程对象:
本课程适合对象: Linux开发者(熟练地使用Linux,在Linux上从事开发)
课程目标:
使培训人员基本理解Linux内核的三驾马车——进程/内存/IO,以及掌握如何有效的去深入理解Linux内核从而进行内核的开发。
使培训人员基本掌握Linux内核编程与驱动开发的方法。
使培训人员基本掌握常见Linux开发与调优工具的使用,投入实际项目开发。
每天上课4小时,上机2小时,每天安排多个上机实践,巩固课堂知识。
课程大纲:
第1天
第1章 Linux系统开发与工具:编译,调试,拦截,跟踪和测试
1 Linux拓扑结构
2 系统调用与C库
- strace和ltrace
3内存管理:
- 进程地址空间:VMA,pmap, VSS/RSS/PSS/USS,lazy分配
- 内存泄漏与缓冲区溢出:smem, valgrind, mpx, …
4 文件系统
- /proc, /debugfs, /var/log, …
5 LD_PRELOAD与动态库捕获
6 GNU工具链
- binutils (addr2line, gprof, objdump, readelf, gcov, …)
- GCC与编译优化
- GDB
7 崩溃转储core dump
8 代码静态分析
9 代码质量保证体系
第2章 Linux内核基础
1 内核release cycle
2 Linux内核学习的方法论
- 分析内核源码如何入手
- 依照4个层次进行内核学习
3 Linux内核编译系统
4 Linux启动过程
5 中断与中断下半部
练习
1 练习通过内核地图定位内核目标代码
2 描绘Linux内核的概念空间
3 用户空间获取内核信息的手段
第2~4天
第3章 进程与进程调度
1 进程生命周期
- 进程的组织关系
- 就绪、运行、睡眠、停止、僵尸
- 孤儿进程的托孤
2 进程和线程
- 创建:fork与clone
- 写时拷贝技术
- 进程0和进程1
3 调度
- 吞吐率与响应
- CPU/IO消耗型进程
- 优先级
- 普通进程调度
- 实时进程调度
4 Linux实时性
- Linux为什么不是硬实时的
- 影响Linux实时性的因素
- RT-Linux与实时性评测cyclictest
5 cgroup和CPU资源控制
练习
1. 观察僵尸进程、进程托孤
2. 调整进程的nice
3. 运行2个高CPU利用率程序,调整他们的nice
4. 用chrt把一个进程调整为实时进程
5. Cyclictest
6. 创建和分组CPU的cgroup,调整权重和quota
第4章 内存管理
1 虚拟地址、物理地址、总线地址
2 内存管理层次以及相应API
- zone
- buddy
- slab
3 进程地址空间
- VMA
- 用户空间malloc/free与内核之间的关系
- page fault的几种可能性,major和minor
- 进程内存消耗的4个概念:vss、rss、pss和uss
- 内存泄露
- 内存耗尽(OOM)、oom_score和oom_adj
4 Page Cache
- read、write和mmap
5 Swap
- file-backed的页面和匿名页
6 内存回收和LRU
7 DMA
- Cache一致性
- 连续内存分配器(CMA)
8 cgroup和内存资源控制
练习
1. 看/proc/zoneinfo,/proc/buddyinfo,/proc/slabinfo,/proc/vmallocinfo
2. pmap一个进程,看一下进程的/proc/<pid>/maps和smaps文件
3. 观察一个程序的RSS/PSS/USS变化
4. smem与valgrind检查内存错误
5. 运行一个很耗费内存的程序,观察oom memory
6. 限制一个cgroup的memory,用cgexec把一个进程放到这个cgroup
第5章 文件系统与I/O
1 Linux Storage Stack
2 文件系统
- VFS
- EXT2/3/4的layout
- 文件系统的日志与掉电保护
- UBI文件系统
3 文件系统校验dm-verity
4 Linux block IO流程
- IO合并
- IO调度
5 IO cgroup
练习
1. dump一个文件系统查看layout
2. cgroup控制io
第5~6天
第6章 内核编程基础及主要API
1 内核编码风格、开发模式
2 Linux内存管理层次及对对应API
- zone
- buddy
- slab
- IO访问
3 DMA
- cache一致性问题
- 连续内存分配器(CMA)
- IOMMU
4 中断
- 中断框架及API
- 中断底半部
- 中断线程化
- 中断负载均衡
5 同步与并发
- atomic, spinlock,mutex,completion深入理解
6 时间管理
- 内核定时器
- 内核延时
第7章 设备驱动开发
1 Linux设备驱动开发的方法论
- Linux设备驱动开发的三个关键
- 模块机制
- 设备模型——总线、设备、驱动
2 Linux复杂设备驱动
- 驱动的分层设计
- platform驱动
- 块设备驱动与块I/O调度
- 网络设备驱动
- 基于I2C/SPI/USB等总线的驱动
3 用户空间驱动
- UIO
- VFIO、mdev
4 内核调试
- printk
- Oops和panic
- initcall_debug
- 内核debug选项:lockup、内存泄漏等
- proc和sys
- soft和hard lockup
- 内核模块的源码级调试
- ftrace
第8章BSP与设备树
1 将Linux移植到一个新的SoC或电路板
2 嵌入式Linux Uboot启动过程
3 设备树(Device Tree)
- 用一个假设的简单电路板从头到尾构建一个dts文件
- dts编译为dtb,与dtb反编译为dts
- machine级的匹配
- driver和device级的匹配
- 基地址、中断、gpio、时钟、reset、pinmux等常规属性
- dts节点自定义属性
- 启动过程中dtb的读取与展开
- i2c, spi子节点的展开
- dts的分级与dtsi
- dt binding文档
4 Yocto
- Yocto开发环境介绍
- Yocto工作流程
- Yocto项目结构与构建
第7天
第9章 系统编程:多进程与多线程
1 进程间通信
- 管道、FIFO、信号、共享内存
2 Linux线程模型
3 Linux线程库
- 线程管理
- 线程同步:互斥锁,条件变量
- 线程属性
4 死锁
5 线程的栈和栈溢出
6 线程调度策略和优先级设置
7 优先级翻转问题
8 串行化难题与阿姆达尔定律
第10章 系统优化:理论和工具
1 USE模型
2吞吐率(影响throughput的因素)
3 延迟(影响latency的因素)
4 cgroup(CPU、Mem、I/O)
5 工具(CPU/Mem/IO)
- IPC/CPI, top, mpstat, 火焰图, perf, …
- iostat, iotop, Swap与I/O, Page cache与I/O, …
- ethtool, netstat, nethogs, lsof, …
- Ftrace, LEP, latencytop