1. QEMU基础与汽车嵌入式环境搭建

各位同学,欢迎来到这门实战课。我是你们的老朋友,一个在嵌入式与虚拟化领域摸爬滚打十几年的工程师。今天咱们开始第一讲:先把地基打牢。

你可能会问:为什么非要用QEMU?直接买块开发板不行吗?我在项目里见过太多团队,硬件还没回来,软件工期已经压到头上了。QEMU就是那个能让你在硬件到货前就把活干完的神器。说白了,它是软件模拟的硬件,但跑起来跟真板子八九不离十。

1.1 QEMU到底是什么?

QEMU是一个开源的虚拟化方案。它有两种工作模式:

  • 系统模式(System Mode):模拟一整台机器,包括CPU、内存、外设。你可以往里面装操作系统。
  • 用户模式(User Mode):只模拟CPU,用来跑单个程序。咱们课程主要用系统模式。

我最早接触QEMU是在2010年,当时要给一个ARM9的工控项目做Bootloader开发。硬件板子还在焊接,我就用QEMU把U-Boot调通了。嗯,那感觉就像考试前拿到了答案。

核心价值一句话:QEMU让你在PC上运行ARM64、RISC-V等架构的完整Linux系统,调试、测试、性能分析全搞定。

1.2 汽车嵌入式Linux有什么不一样?

汽车上的Linux,跟服务器上的Linux不是一回事。我列个表,你一看就明白:

对比项 通用嵌入式Linux 汽车嵌入式Linux
启动时间要求 几秒到几十秒 仪表盘要求<2秒,IVI<5秒
实时性 软实时或不要求 硬实时(刹车、转向控制)
安全标准 无强制要求 ISO 26262 ASIL-B/D
外设复杂度 简单GPIO、UART CAN/CAN-FD、以太网AVB、MIPI CSI
OTA升级 可选 必须支持,且要保证安全回滚

你看,汽车场景对启动速度的要求极其苛刻。驾驶员点火后,倒车影像必须在2秒内显示出来。这就是为什么咱们这门课要专门讲启动优化。

注意:汽车嵌入式Linux通常基于Yocto或Buildroot构建,裁剪到极致。你不可能拿一个完整的Ubuntu镜像直接往车上装——那启动时间会让你崩溃的。

1.3 从源码编译QEMU

我建议你从源码编译QEMU,而不是直接用apt安装。为什么?因为发行版自带的QEMU版本往往比较老,缺少一些汽车场景需要的外设模拟(比如CAN控制器)。

编译步骤其实不复杂:

# 1. 安装依赖(Ubuntu 22.04为例)
sudo apt-get install git libglib2.0-dev libfdt-dev \
  libpixman-1-dev zlib1g-dev ninja-build

# 2. 克隆源码
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu

# 3. 配置(只编译ARM64目标)
./configure --target-list=aarch64-softmmu \
  --enable-debug \
  --enable-kvm

# 4. 编译(-j后面跟CPU核心数)
make -j$(nproc)

# 5. 验证
./build/qemu-system-aarch64 --version

这里有个坑,我曾经踩过:--enable-kvm 这个选项,如果你在虚拟机里编译,KVM可能不可用。没关系,不加也能用,只是少了硬件加速。咱们后面会专门讲怎么用KVM加速。

我的习惯:编译时加上 --enable-debug,这样出问题可以加 -d trace 参数看QEMU内部日志。调试汽车启动流程时,这个功能救过我很多次。

1.4 配置ARM64虚拟平台

QEMU支持多种ARM64虚拟平台。咱们课程主要用 virt 平台。为什么选它?

  • 它是QEMU官方维护的通用虚拟平台
  • 支持GICv3中断控制器(汽车SoC标配)
  • 可以灵活配置CPU数量、内存大小、外设
  • 支持virtio半虚拟化设备(性能好)

下面是一个典型的启动参数:

./qemu-system-aarch64 \
  -machine virt,virtualization=on,gic-version=3 \
  -cpu cortex-a72 \
  -smp 4 \
  -m 2G \
  -kernel Image \
  -append "console=ttyAMA0 root=/dev/vda rw" \
  -drive file=rootfs.qcow2,if=virtio,format=qcow2 \
  -netdev user,id=net0 \
  -device virtio-net-pci,netdev=net0 \
  -nographic

参数解释一下:

  • -machine virt:选择virt平台,开启虚拟化扩展和GICv3
  • -cpu cortex-a72:模拟Cortex-A72,汽车芯片常用核心
  • -smp 4:4个CPU核心,模拟多核环境
  • -m 2G:2GB内存,够跑一个轻量级汽车Linux
  • -kernel Image:直接加载内核镜像,跳过固件
  • -drive if=virtio:使用virtio块设备,比模拟SD卡快很多

注意:汽车场景下,-machine virt 的 virtualization=on 必须开启。否则后面我们讲KVM加速时,你会遇到"kvm not supported"的错误。

1.5 启动第一个虚拟开发板

好,现在我们来真的。你需要准备三样东西:

  1. 内核镜像(Image):编译好的ARM64 Linux内核
  2. 根文件系统(rootfs):我用Buildroot做了一个最小系统,包含busybox和必要的驱动
  3. 设备树(dtb):QEMU virt平台的设备树文件

启动命令:

./qemu-system-aarch64 \
  -machine virt,virtualization=on,gic-version=3 \
  -cpu cortex-a72 \
  -smp 2 \
  -m 1G \
  -kernel Image \
  -dtb qemu-virt.dtb \
  -append "console=ttyAMA0 root=/dev/vda rw earlyprintk" \
  -drive file=rootfs.ext4,if=virtio,format=raw \
  -nographic

如果一切顺利,你会看到内核启动日志,最后出现一个shell提示符。输入 uname -a,你会看到:

Linux qemu-virt 6.1.0 #1 SMP PREEMPT Thu Jan 1 00:00:00 UTC 2025 aarch64 GNU/Linux

看到这个输出,恭喜你——你的第一个虚拟汽车开发板跑起来了。

避坑指南:我曾经在启动时卡在 Waiting for root device /dev/vda。原因是根文件系统格式不对。记住:virtio块设备需要根文件系统是ext4格式,并且内核要编译进virtio驱动(不能是模块)。

1.6 本章知识体系

下面这张图帮你理清本章的核心逻辑:

QEMU汽车嵌入式环境搭建知识体系 第1章:QEMU基础与汽车嵌入式环境搭建 QEMU虚拟化方案 系统模式 vs 用户模式 汽车Linux特点 ARM64虚拟平台 QEMU源码编译 --target-list=aarch64-softmmu --enable-kvm --enable-debug 启动时间 & 实时性 仪表盘<2秒 | IVI<5秒 ISO 26262 ASIL安全等级 virt平台配置 -machine virt,gic-version=3 -cpu cortex-a72 -smp 4 -m 2G 启动第一个虚拟开发板 核心目标:在PC上搭建可复用的汽车嵌入式Linux开发环境 为后续启动优化、KVM加速、实时性调优打下基础

这张图把本章的知识点串起来了。从QEMU的两种模式出发,到汽车Linux的特殊要求,再到ARM64虚拟平台的配置,最后汇聚到启动第一个虚拟开发板。后面的章节,我们会在这个基础上一步步做启动优化。

小结一下:今天你学会了QEMU的基本概念,了解了汽车嵌入式Linux的独特之处,亲手从源码编译了QEMU,配置了ARM64 virt平台,并且成功启动了一个虚拟开发板。这些是后面29章的基础。我建议你把今天的实验多做几遍,直到不用看笔记也能敲出启动命令。