1. 课程导论与目标
本课程面向具备C语言、Linux基础与计算机组成原理知识的开发者,系统讲解如何在QEMU虚拟化环境中从零搭建PCIe网卡设备模型,并编写对应的Linux内核驱动程序。课程以“动手实践”为核心,最终交付一个可在QEMU中运行、支持数据收发的完整PCIe网卡驱动。
1.1 课程目标
| 目标维度 | 具体描述 |
|---|---|
| 环境搭建 | 配置QEMU + Linux内核编译 + 根文件系统,建立可重复的调试环境 |
| 设备模拟 | 在QEMU中实现一个PCIe网卡设备模型,支持MMIO、DMA、中断 |
| 驱动开发 | 编写Linux内核PCIe网卡驱动,完成设备探测、初始化、数据收发 |
| 调试验证 | 使用QEMU monitor、GDB、ftrace、dmesg进行全链路调试 |
1.2 学习路径
课程按“基础→模拟→驱动→调试”四阶段递进,每阶段包含理论讲解与动手实验。
- 阶段一:环境准备 — 安装QEMU、编译Linux内核、制作initramfs根文件系统
- 阶段二:PCIe设备模拟 — 在QEMU源码中添加自定义PCIe网卡设备,配置BAR空间、MSI-X中断
- 阶段三:驱动开发 — 编写内核模块,实现probe、open、stop、hard_start_xmit、中断处理
- 阶段四:调试与优化 — 使用QEMU monitor查看PCIe配置空间,GDB单步调试驱动,ftrace分析性能
路径特点:每阶段均提供可运行的代码快照,学员可在任意节点对比验证,避免“一步错步步错”。
1.3 前置知识要求
| 知识领域 | 具体要求 | 推荐参考 |
|---|---|---|
| C语言 | 指针、结构体、内存操作、链表 | 《C程序设计语言》第5-7章 |
| Linux基础 | 命令行操作、内核模块编译、设备文件概念 | 《鸟哥的Linux私房菜》基础篇 |
| 计算机组成原理 | CPU、内存、I/O总线、中断、DMA基本概念 | 《计算机组成与设计》第4-6章 |
建议:若对PCIe协议不熟悉,课程会在阶段二补充PCIe配置空间、BAR、MSI-X等核心概念,无需提前深究。
1.4 最终成果
完成本课程后,你将获得以下可交付成果:
- QEMU设备模型源码 — 一个完整的PCIe网卡设备,支持MMIO读写、DMA传输、MSI-X中断
- Linux内核驱动模块 — 可加载的.ko文件,实现网络设备注册、数据包收发、中断处理
- 调试脚本集 — 包含QEMU启动参数、GDB初始化脚本、ftrace配置模板
- 验证测试用例 — 在QEMU guest中执行ping、iperf、tcpdump验证驱动功能
注意:本课程不涉及硬件真实网卡驱动移植,所有实验均在QEMU虚拟化环境中完成,避免硬件损坏风险。
1.5 课程知识体系总览
1.6 课程特色与学习建议
- 全虚拟化环境 — 无需真实硬件,降低入门门槛,支持反复重置实验状态
- 代码即文档 — 每章提供完整可编译源码,配合注释讲解关键设计决策
- 调试贯穿始终 — 从QEMU monitor到GDB再到ftrace,建立系统级调试思维
- 避坑指南 — 总结常见错误(如BAR地址对齐、DMA缓存一致性、中断丢失),提供排查步骤
学习建议:准备一个专用虚拟机或Docker环境,避免与主机开发环境冲突。每完成一章,执行一次“make clean && make”确保环境一致性。