4006-998-758
3000+课程任你选择
Linux内核和系统开发
研发学院 Linux内核 系统开发
任桥伟

上海交大博士,活跃于Linux内核、OpenStack、Ceph、Cloud Native等开源社区

专家博客目前访问量数百万排名TOP 100,订阅量排名TOP 20

《Linux内核修炼之道》、《Linux那些事儿》作者

曾在知名IC公司OS/Driver部门带领完成Linux在全新SoC芯片上的移植、芯片内部及外围各种设备驱动的开发工作。对Linux内核和驱动开发有很深的研究,并总结提出了独创性的内核学习方法和驱动开发方法。长期研究Linux应用的开发方法和调试技术,具有丰富的网络、控制、消费电子等行业的产品开发经验。

曾为施耐德、富士通、贝尔、富士康、德赛西威、西门子、飞利浦、南瑞、冠捷、英飞拓、ABB等知名企业提供嵌入式Linux企业培训和技术服务。


查看老师详情
课程内容

课程概要:

这是一个全方位覆盖 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


返回上一级