news 2026/5/26 9:36:59

Ubuntu QEMU实战:从零构建嵌入式开发环境

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu QEMU实战:从零构建嵌入式开发环境

1. 为什么选择QEMU搭建嵌入式开发环境?

刚接触嵌入式开发的朋友们可能都有这样的困惑:动辄上千元的开发板,复杂的硬件调试工具,还有各种难以复现的环境问题。我在2015年第一次接触STM32开发时就深有体会——一个简单的GPIO控制实验,因为硬件接触不良调试了整整两天。直到后来发现了QEMU这个神器,才明白原来80%的嵌入式开发调试工作,完全可以在虚拟环境中完成。

QEMU的全称是Quick Emulator,它最大的特点就是能模拟各种CPU架构(ARM、MIPS、RISC-V等)和硬件设备。我实测下来,用QEMU模拟树莓派开发环境,从编译到调试的完整流程,比真机开发效率至少提升30%。特别是在团队协作时,再也不用担心"在我机器上能跑"的经典问题了——每个人拿到的都是完全一致的虚拟硬件环境。

2. 环境准备与QEMU安装

2.1 基础环境配置

我推荐使用Ubuntu 22.04 LTS版本,这个长期支持版对各种开发工具的支持最完善。先更新软件源是个好习惯:

sudo apt update && sudo apt upgrade -y

安装编译工具链时,ARM架构和x86架构需要的包略有不同。如果是开发ARM嵌入式系统(比如树莓派),建议安装以下工具链:

sudo apt install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

2.2 QEMU安装详解

官方源里的QEMU版本可能比较旧,我更喜欢用更全能的qemu-system包:

sudo apt install -y qemu-system qemu-utils

安装完成后,验证下ARM模拟支持是否正常:

qemu-system-arm --version

如果遇到依赖问题(特别是32位库兼容性),可以试试这个万能修复命令:

sudo apt --fix-broken install

3. 获取和配置系统镜像

3.1 官方镜像与自定义编译

对于树莓派开发,官网提供的raspios镜像可以直接使用:

wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf-lite.img.xz unxz 2023-05-03-raspios-bullseye-armhf-lite.img.xz

但官方镜像可能缺少某些开发工具,我更喜欢用Debian官方提供的ARMHF镜像自己定制:

wget https://cdimage.debian.org/cdimage/archive/11.7.0/armhf/iso-cd/debian-11.7.0-armhf-netinst.iso

3.2 镜像扩容技巧

默认镜像通常只有2GB左右,我用qemu-img工具扩容到8GB:

qemu-img resize 2023-05-03-raspios-bullseye-armhf-lite.img +6G

扩容后还需要在系统内用fdisk调整分区,这个步骤比较关键:

fdisk /dev/mmcblk0 # 删除第二分区后重建 # 注意保持起始扇区不变

4. QEMU启动参数详解

4.1 基础启动命令

这是我调试过最稳定的树莓派模拟命令:

qemu-system-arm \ -M raspi2b \ -cpu cortex-a7 \ -m 1G \ -kernel kernel-qemu-5.10.63-bullseye \ -dtb versatile-pb-bullseye.dtb \ -sd 2023-05-03-raspios-bullseye-armhf-lite.img \ -append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait" \ -serial stdio \ -net nic \ -net user,hostfwd=tcp::5022-:22

几个关键参数说明:

  • -M raspi2b指定树莓派2B型号
  • -sd指定虚拟SD卡镜像
  • hostfwd将虚拟机的22端口映射到主机的5022端口

4.2 网络配置进阶

要实现完整的网络功能,需要配置TAP设备:

sudo ip tuntap add dev tap0 mode tap sudo ip link set tap0 up sudo ip addr add 192.168.100.1/24 dev tap0

然后在QEMU启动参数中加入:

-net nic -net tap,ifname=tap0,script=no

5. 开发环境实战技巧

5.1 交叉编译配置

在主机上编译ARM程序时,需要指定正确的工具链:

export CC=arm-linux-gnueabihf-gcc export CXX=arm-linux-gnueabihf-g++

CMake配置示例:

set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)

5.2 内核调试技巧

要调试Linux内核,需要带调试信息的版本:

qemu-system-arm -kernel zImage -append "kgdboc=ttyAMA0,115200" -serial tcp::1234,server

然后在主机上用gdb-multiarch连接:

gdb-multiarch vmlinux target remote :1234

6. 常见问题排查

6.1 启动卡住问题

如果系统启动卡在"Booting Linux...",通常是内核参数不匹配:

  1. 检查-append中的root参数是否正确指向根分区
  2. 确认dtb文件与内核版本匹配
  3. 尝试添加earlyprintk参数查看早期日志

6.2 网络连接失败

网络不通时建议分步检查:

  1. 确认虚拟机内网卡是否识别:ip link show
  2. 测试DHCP是否工作:dhclient eth0
  3. 检查主机iptables规则是否拦截

我在实际项目中遇到最棘手的问题是USB设备穿透,后来发现需要添加以下参数:

-device usb-host,vendorid=0x1234,productid=0x5678

7. 性能优化建议

经过多次测试,这些配置能显著提升QEMU性能:

  1. 启用KVM加速(x86主机):
    -enable-kvm -cpu host
  2. 使用virtio设备:
    -drive file=disk.img,if=virtio -net nic,model=virtio
  3. 调整内存分配策略:
    -mem-prealloc -mem-path /dev/hugepages

对于嵌入式开发,我建议将常用命令写成脚本。比如这是我的start_qemu.sh

#!/bin/bash qemu-system-arm \ -M virt \ -cpu cortex-a15 \ -m 1024 \ -kernel zImage \ -dtb virt.dtb \ -drive file=rootfs.ext4,if=virtio,format=raw \ -append "root=/dev/vda rw console=ttyAMA0" \ -nographic \ -net nic,model=virtio \ -net user,hostfwd=tcp::2222-:22

记得给脚本执行权限:chmod +x start_qemu.sh

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 9:36:01

AI写专著必备:掌握AI专著写作技巧,3天搞定20万字专著!

学术专著写作困境与AI工具解决方案 学术专著的严谨性,必然需要大量的资料和数据来支撑。收集资料和整合数据常常是写作过程中最繁琐和耗时的部分。研究者必须全面获取国内外的前沿文献,不仅要关注文献的权威性和相关性,还需追溯到原始来源&a…

作者头像 李华
网站建设 2026/5/26 9:35:03

安卓+PC专属|青禾去水印 APP 免费无广告 多媒体素材处理工具

下载地址:https://pan.baidu.com/s/1Rb33ZaC7NYuhhoGx-VoZAw?pwd=yxai 龙虾 Skill 技能库|OpenClaw+Hermes 全集成,一键调用所有 AI 技能 https://ai-skills.ai/?inviteCode=S2JV3NCK 目录 前言 一、软件基础介绍 二、核心实用特点 1. 免费去水印 无痕无残留 2. 纯净…

作者头像 李华
网站建设 2026/5/26 9:35:02

Adobe-GenP 3.0:终极免费激活Adobe全家桶的完整解决方案

Adobe-GenP 3.0:终极免费激活Adobe全家桶的完整解决方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 想要免费解锁Adobe全家桶软件的所有功能吗&…

作者头像 李华
网站建设 2026/5/26 9:32:51

晶体管到代码:计算机底层原理揭秘

本文基于教程:https://www.youtube.com/playlist?listPL9vTTBa7QaQOoMfpP3ztvgyQkPWDPfJez 如有疑惑,请移步观看课程视频。 一、晶体管与代码执行 单个晶体管通常有三个引脚:集电极(collector)、发射极(e…

作者头像 李华
网站建设 2026/5/26 9:32:01

伯努利分布:二元决策的统计基石与业务落地指南

1. 这不是数学课,是解决现实问题的“概率扳手”你有没有遇到过这样的场景:电商运营在凌晨三点盯着AB测试后台,心里打鼓——新首页按钮点击率比旧版高了0.8%,这到底是真实提升,还是随机波动?又或者&#xff…

作者头像 李华
网站建设 2026/5/26 9:31:36

海德汉PWM21/PWT101:解锁Endat信号与高精度光栅尺的终极诊断工具

1. 海德汉PWM21/PWT101:工程师的Endat信号诊断利器 第一次遇到海德汉Endat编码器故障时,我和大多数同行一样手足无措。那台价值百万的数控磨床突然报出"位置反馈异常",但传统示波器上只有一堆看不懂的数字脉冲。直到接触到PWM21这…

作者头像 李华