第一课:课程导论与实验环境准备

大家好,我是你们这门课的老朋友。说实话,每次开新课前我都在想,怎么把那些枯燥的概念讲得有意思点。今天咱们聊的QEMU,说白了就是一个“模拟器中的瑞士军刀”。

你可能要问:为什么放着真机不用,非要在模拟器上折腾?嗯,这个问题我当年也问过自己。直到有一次,我在一块刚拿到的开发板上调试内核,一个bug直接把板子搞成了砖头……从那以后,我再也不敢轻视模拟器的价值了。

什么是QEMU?

QEMU的全称是Quick EMUlator。它不是一个简单的模拟器,而是一个可以模拟整个计算机系统的“虚拟硬件平台”。

我个人习惯把它分成两个角色来看:

  • 系统模拟器:模拟一整台电脑,包括CPU、内存、硬盘、网卡等。你可以在这台“虚拟电脑”上装操作系统。
  • 用户态模拟器:只模拟CPU指令集,用来运行单个程序。比如在x86的Linux上跑ARM的二进制文件。

我们这门课主要用的是系统模拟器模式。你想想看,在QEMU里跑内核,就像在实验室里搭了一个完全可控的“沙盒”。

核心优势:QEMU让你可以在自己的笔记本上,模拟出ARM、RISC-V、MIPS等各种架构的硬件环境。调试内核时,你可以随时暂停、单步执行、查看寄存器——这些在真机上很难做到。

为什么要在QEMU上运行自定义内核?

我在项目中遇到过不少新手,一上来就买块开发板,结果光搭建交叉编译环境就折腾了两周。更惨的是,写了个简单的内核模块,加载时直接死机,连错误日志都来不及看。

用QEMU的好处,说白了就三条:

  1. 零硬件成本:你不需要买任何开发板。一台普通电脑就够了。
  2. 调试能力极强:QEMU内置了GDB调试支持。你可以像调试普通程序一样调试内核。
  3. 快照与恢复:内核崩溃了?没关系,恢复到一个快照点,继续调试。我曾经用这个功能,一天之内定位了三个内核bug。

我的建议:如果你刚开始学内核开发,先在QEMU上跑通一个最小内核,再考虑真机。这能帮你省下至少80%的调试时间。

实验环境搭建

好,理论说完了,咱们动手。下面是我整理的环境搭建步骤,每一步我都踩过坑,你照着做基本不会出问题。

1. Linux系统准备

我推荐使用Ubuntu 22.04 LTS或Debian 12。为什么?因为这两个发行版的软件包比较新,而且社区支持好。如果你用其他发行版,原理一样,只是包管理器命令不同。

先更新系统:

sudo apt update
sudo apt upgrade -y

2. 安装GCC交叉编译器

我们要编译能在QEMU上运行的内核,所以需要交叉编译器。这里以ARM架构为例:

sudo apt install gcc-arm-linux-gnueabi
sudo apt install gcc-arm-linux-gnueabihf

这两个的区别?gnueabi是软浮点,gnueabihf是硬浮点。我一般用硬浮点的版本,性能更好。

验证安装:

arm-linux-gnueabihf-gcc --version

如果看到版本号,说明安装成功。

3. 安装QEMU

安装QEMU系统模拟器:

sudo apt install qemu-system-arm
sudo apt install qemu-system-common

验证安装:

qemu-system-arm --version

注意:我曾经遇到过一个问题——安装后运行qemu-system-arm提示“无法找到命令”。后来发现是PATH环境变量没包含/usr/bin。如果你也遇到类似情况,检查一下PATH设置。

4. 安装其他辅助工具

这些工具不是必须的,但能让你开发更顺手:

sudo apt install make
sudo apt install git
sudo apt install gdb-multiarch  # 多架构GDB调试器

知识体系总览

下面这张图,是我画的本课程核心知识结构。你可以把它当作一张“地图”,随时回来看看自己走到哪了。

QEMU自定义内核实战 - 知识体系 实验环境搭建 Linux + GCC + QEMU 内核编译与配置 menuconfig + 交叉编译 QEMU启动内核 命令行参数 + 设备树 内核调试技术 GDB + QEMU调试 + 日志分析 实战项目:从最小内核到完整系统 设备驱动 + 文件系统 + 网络协议栈 本课程共30章,循序渐进,从零开始构建你的内核开发能力

验证环境是否搭建成功

环境搭好了,咱们跑个简单的测试。用QEMU启动一个ARM架构的Linux内核(这里用官方提供的内核镜像测试):

# 下载测试内核
wget https://releases.linaro.org/components/kernel/uefi-linaro/5.10/release/qemu/qemu-system-aarch64 -O test-kernel

# 启动QEMU(如果下载不到,可以用本地编译的内核替代)
qemu-system-arm -M versatilepb -kernel test-kernel -nographic

如果看到内核启动日志,说明环境搭建成功了。嗯,这里要注意,第一次启动可能会有点慢,因为QEMU在初始化模拟硬件。

避坑指南:我曾经在Windows上用WSL2搭建环境,结果QEMU的网络模拟一直有问题。后来发现是WSL2的网络层和QEMU的tap设备不兼容。所以,我建议你直接用原生Linux系统,或者用虚拟机装一个Linux。

小结

这一课我们聊了QEMU是什么,为什么用它,以及怎么搭建实验环境。说白了,QEMU就是你的“虚拟开发板”,有了它,你可以放心大胆地折腾内核,不用担心把真机搞坏。

下一课,我们会开始写第一个“最小内核”——一个能在QEMU上打印出“Hello World”的裸机程序。听起来简单,但这里面涉及到的启动流程、链接脚本、内存布局,都是内核开发的核心知识。

好,今天的课就到这儿。如果你在环境搭建中遇到问题,欢迎随时交流。记住,调试内核就像解谜,每一步都有它的意义。


专注资料整理