- C 47.5%
- Python 30.5%
- Shell 12.7%
- Makefile 3.2%
- BitBake 2.9%
- Other 3.2%
| docs | ||
| labs | ||
| scripts | ||
| tests | ||
| yocto/meta-linux-trainer | ||
| .gitignore | ||
| 1-learn-linux-user-space-debugging.org | ||
| 2-inside-elf.org | ||
| Makefile | ||
| README.org | ||
从用户态调试到 Linux 内核与嵌入式开发
这套教程学什么
这是一套中文、实验驱动的 Linux 开发教程。沿着原仓库的课程主题,从命令行与 C 程序出发, 学习用户态调试、ELF、系统调用、内核模块、字符设备、内存与同步、中断与时间, 最后构建可启动的虚拟 Linux 系统,并用 Yocto 组织应用和镜像。
完成主线后,你应能解释一次文件读写如何进入内核,定位一个程序错误,制作自己的 initramfs,在 QEMU 中加载驱动,并交付有测试记录的用户态—内核态实验项目。 它面向系统软件和嵌入式开发;桌面使用、生产运维、网络协议栈内部实现及真实板卡 BSP 移植只提供必要基础,不宣称覆盖所有 Linux 专业方向。
正文、实验和练习为独立编写。原仓库的付费课程链接仅用于确认选题,不代表获取或复刻了课程内容。 原始目录保存在 历史记录,其中未经核实、与 Linux 无关的链接不作为教程资料。 教程包含 24 章主线和 13 章进阶路线,共 37 章。 进阶路线按原网站公开大纲补入完整字符设备、同步机制、硬件 IRQ、Yocto 系统集成、ARM 启动链和内核调试等内容。 逐门对应及各项的实验边界见 原网站课程补充对照表(2026-10-02)。
从这里开始
先阅读 00 实验环境与学习方法。在仓库根目录执行:
make doctor
make -j2
make check
./build/debug_sum
./build/debug_sum --fixed
最后两行分别得到 sum=50 和 sum=60=。第 04 章将用 GDB 找到这 10 的差值从何而来。
=make check 检查用户态程序行为、教程链接、答案定位、Shell 代码块语法和 Yocto 本地配方输入;不加载模块或下载软件。
只检查文档可执行 =make check-docs=。
完整目录
| 阶段 | 章节 | 学完应能做什么 |
|---|---|---|
| 准备 | 00 环境与学习方法 | 建立可复现的环境,记录版本 |
| 基础 | 01 命令行、文件与权限 | 使用管道、重定向、权限和进程工具 |
| 基础 | 02 C、编译和 Make | 理解指针、生命周期和错误处理 |
| 用户态 | 03 进程、文件 I/O 与管道 | 处理短读写、EOF、fork 和进程回收 |
| 用户态 | 04 GDB 调试 | 用断点、单步和变量检查定位错误 |
| 用户态 | 05 core dump 与内存错误 | 用工具验证越界和泄漏的修复 |
| 用户态 | 06 strace 与 ltrace | 收集系统调用和库调用证据 |
| 运行机制 | 07 ELF、链接和装载 | 构造与排查共享库依赖 |
| 并发 | 08 线程、信号与 IPC | 选择同步和通信机制 |
| 系统基础 | 09 网络、服务与资源观察 | 调试本地 TCP 服务,查看日志 |
| 内核 | 10 内核源码与构建 | 固定版本,在独立目录构建内核 |
| 内核 | 11 模块与生命周期 | 编译、加载和卸载模块 |
| 驱动 | 12 字符设备与用户接口 | 实现有边界约定的二进制邮箱 |
| 内核 | 13 用户态与内核内存管理 | 区分地址、分配策略与所有权 |
| 内核 | 14 内核同步 | 根据上下文选择锁并分析死锁 |
| 硬件 | 15 设备模型、MMIO、DMA 与设备树 | 理解驱动绑定和硬件资源 |
| 内核 | 16 中断与延迟执行 | 区分中断上下文与工作队列 |
| 内核 | 17 系统调用与 ABI | 追踪 read 路径,设计兼容接口 |
| 内核 | 18 时间子系统 | 选择时钟,处理周期计时 |
| 嵌入式 | 19 QEMU 与最小根文件系统 | 启动自己的 Linux 和驱动 |
| 嵌入式 | 20 Yocto:镜像、配方、层与 SDK | 构建镜像、加入应用、生成 SDK |
| 质量 | 21 用户态与内核测试 | 编写边界测试,运行 KUnit |
| 诊断 | 22 内核日志、ftrace 与 GDB | 建立故障证据链 |
| 项目 | 23 综合项目与结课验收 | 交付设备、客户端、镜像和报告 |
推荐学习顺序为:=00—10 → 19 → 11—18 → 20—23=。 第 19 章先准备客体,后面的模块实验才能运行;第一次读到它时,完成启动与验收后返回第 11 章。 有 C/Linux 基础的读者可用 00—03 章验收题自测后从 04 开始。 每次学习完成一个实验并保存观察记录;进度以能解释结果为准。
主线之后进入 A01—A13 进阶目录。其中 A02—A06 使用同一套自动内核验收, A08—A09 扩展 Yocto 层,A10 构建 ARM64 的 U-Boot → Linux → ext4 启动链,A11—A13 提供测试、调试及板级路线。
配套内容
- 用户态 C 示例:正常程序、调试靶程序、动态库和设备验收客户端。
- trainer 字符设备 与 pulse 周期工作模块。
- 7 个进阶模块、ELF 构造实验、新增系统调用、板级辅助程序。
- 无需 root 的 initramfs 打包器、QEMU 启动脚本。
- ARM ext4 制作器、GDB/KGDB 自动会话、进阶实验构建入口。
- Yocto 教学层:应用源码、配方及层配置。
- 练习参考答案、术语表、故障排查索引。
- 实际验证记录、官方资料与版本依据。
版本与实验约定
命令默认从仓库根目录执行;标注“客体”的命令在 QEMU Linux 内执行。
主线使用 x86-64 Linux 主机和 x86-64 客体,用户态工具脚本需要 Python 3.8 或更新版本。
ARM 主机的交叉编译需要另行配置工具链和目标 BusyBox,不直接套用本教程的本机 gcc 命令。
教学内核固定为 Linux 6.12,Yocto 示例使用 Scarthgap 系列,并要求记录实际 commit。
选用这些版本是为了让讲解与接口对应,不将其称为当前最新版本。
安装命令以 Ubuntu/Debian 为例。WSL2 可完成大多数用户态实验;模块运行使用 QEMU 自己启动的内核。
完成第 19 章构建后,执行 make check-guest 可自动验证设备、模块生命周期、ftrace 和周期工作。
章节中的 Shell、GDB 提示符和客体终端是不同会话。标注“预期失败”的命令需要观察错误码, 不要把整章当成遇错即停的脚本一次执行。=make clean= 会删除整个 =build/=,包括内核源码、镜像和实验日志。 需要保留的笔记与报告请放在该目录之外。
本仓库仅把验证记录中列明的项目标为已实测。真实板卡需要对应硬件资料, 第 15 章提供资源分析练习,不给未经硬件核实的寄存器写入命令。 进阶实验已验证的范围与 Yocto 完整镜像/SDK、实体板等尚未执行的项目,见 补充验证记录。