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 学习路径

课程按“基础→模拟→驱动→调试”四阶段递进,每阶段包含理论讲解与动手实验。

  1. 阶段一:环境准备 — 安装QEMU、编译Linux内核、制作initramfs根文件系统
  2. 阶段二:PCIe设备模拟 — 在QEMU源码中添加自定义PCIe网卡设备,配置BAR空间、MSI-X中断
  3. 阶段三:驱动开发 — 编写内核模块,实现probe、open、stop、hard_start_xmit、中断处理
  4. 阶段四:调试与优化 — 使用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 课程知识体系总览

课程知识体系结构图 课程知识体系结构 环境准备 PCIe设备模拟 驱动开发 调试验证 QEMU安装 · 内核编译 initramfs制作 PCIe配置空间 · BAR MMIO · DMA · MSI-X probe · open · stop 数据收发 · 中断处理 QEMU monitor · GDB ftrace · dmesg 最终交付:QEMU PCIe网卡 + Linux驱动 + 调试工具链 课程设计原则 每阶段提供可运行代码快照 · 支持任意节点对比验证 · 避免“一步错步步错”

1.6 课程特色与学习建议

  • 全虚拟化环境 — 无需真实硬件,降低入门门槛,支持反复重置实验状态
  • 代码即文档 — 每章提供完整可编译源码,配合注释讲解关键设计决策
  • 调试贯穿始终 — 从QEMU monitor到GDB再到ftrace,建立系统级调试思维
  • 避坑指南 — 总结常见错误(如BAR地址对齐、DMA缓存一致性、中断丢失),提供排查步骤

学习建议:准备一个专用虚拟机或Docker环境,避免与主机开发环境冲突。每完成一章,执行一次“make clean && make”确保环境一致性。