当前位置: 首页 > news >正文

在Windows11上通过QEMU构建ARM64开发测试环境

1. 为什么要在Windows11上搭建ARM64环境?

最近几年ARM架构处理器越来越火,从手机芯片到苹果M系列处理器,再到各种物联网设备,ARM64已经成了不可忽视的技术生态。作为开发者,我们经常需要在本地测试ARM平台的软件兼容性,或者为嵌入式设备交叉编译程序。但现实是,大多数人的主力开发机还是x86架构的Windows电脑。

我之前在给树莓派开发程序时就遇到这个问题——本地编译好的x86程序放到ARM设备上完全跑不起来。后来发现用QEMU模拟ARM环境是个不错的解决方案,特别是配合Windows11的WSL2使用,效果出奇地好。这个方案最大的优势是不需要额外购买ARM开发板,用现有的Windows电脑就能搭建完整的ARM64开发测试环境。

2. 环境准备与工具安装

2.1 获取必要软件包

首先需要下载几个关键组件。QEMU的Windows版本可以从官网获取,我推荐使用weilnetz.de提供的预编译版本,这个版本对Windows支持最好:

https://qemu.weilnetz.de/w64/

UEFI固件文件是ARM虚拟机启动的关键,建议使用Linaro维护的版本:

https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd

至于操作系统镜像,我实测下来openEuler对ARM虚拟机的兼容性最好,下载地址:

https://mirrors.tuna.tsinghua.edu.cn/openeuler/openEuler-20.03-LTS-SP3/ISO/aarch64/openEuler-20.03-LTS-SP3-aarch64-dvd.iso

2.2 安装配置QEMU

下载完QEMU安装包后直接运行安装程序,建议使用默认路径。安装完成后需要将QEMU的安装目录(比如C:\Program Files\qemu)添加到系统PATH环境变量中。这样后续就可以在任何目录下直接调用qemu命令。

验证安装是否成功:

qemu-system-aarch64 --version

如果看到版本号输出,说明安装正确。我建议同时安装tap-windows虚拟网卡驱动,后面配置网络时会用到:

https://build.openvpn.net/downloads/releases/tap-windows-9.24.7-I601-Win10.exe

3. 创建和配置ARM虚拟机

3.1 初始化虚拟磁盘

在PowerShell中执行以下命令创建20GB的虚拟磁盘:

qemu-img create -f qcow2 openEuler-arm64.img 20G

这里使用qcow2格式而不是raw格式,主要是因为:

  • 支持动态扩容,实际占用空间随使用量增长
  • 支持快照功能
  • 磁盘压缩效率更高

3.2 网络配置技巧

为了让虚拟机能够上网,需要配置网卡共享:

  1. 安装完tap-windows后,在网络连接中会看到新增的网卡
  2. 重命名这个网卡为"QEMU-TAP"方便识别
  3. 右键点击主机的物理网卡 → 属性 → 共享
  4. 勾选"允许其他网络用户通过此计算机的Internet连接来连接"
  5. 在下拉菜单中选择刚才创建的QEMU-TAP网卡

这个配置我调试了很久才成功,关键点是主机防火墙要放行相关网络连接。

4. 安装和运行ARM系统

4.1 启动安装命令

完整的安装命令如下(注意替换路径为你自己的实际路径):

qemu-system-aarch64 -m 4G -cpu cortex-a72 -smp 4 -M virt -bios QEMU_EFI.fd \ -net nic -net tap,ifname=QEMU-TAP \ -device nec-usb-xhci -device usb-kbd -device usb-mouse \ -device VGA \ -drive if=none,file=openEuler-20.03-LTS-SP3-aarch64-dvd.iso,id=cdrom,media=cdrom \ -device virtio-scsi-device -device scsi-cd,drive=cdrom \ -drive if=none,file=openEuler-arm64.img,id=hd0 \ -device virtio-blk-device,drive=hd0

几个关键参数说明:

  • -m 4G:分配4GB内存,建议不低于2GB
  • -cpu cortex-a72:模拟ARM Cortex-A72处理器
  • -smp 4:使用4个CPU核心
  • -net tap,ifname=QEMU-TAP:使用之前配置的虚拟网卡

4.2 安装过程注意事项

安装界面启动后,按照常规Linux安装流程操作即可。有几点需要特别注意:

  1. 分区时选择自动分区最省事
  2. 创建用户时建议勾选"将此用户设为管理员"
  3. 软件包选择建议包含开发工具集
  4. 安装过程确实比较慢,在我的i7笔记本上花了约40分钟

5. 日常使用与优化技巧

5.1 启动已安装的系统

安装完成后,去掉ISO相关的参数即可正常启动:

qemu-system-aarch64 -m 4G -cpu cortex-a72 -smp 4 -M virt -bios QEMU_EFI.fd \ -net nic -net tap,ifname=QEMU-TAP \ -device nec-usb-xhci -device usb-kbd -device usb-mouse \ -device VGA \ -drive if=none,file=openEuler-arm64.img,id=hd0 \ -device virtio-blk-device,drive=hd0

5.2 启用SSH远程连接

在虚拟机内编辑网络配置:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

将ONBOOT改为yes,保存后重启网络服务:

systemctl restart network

然后就可以用Xshell等工具通过IP连接了。如果遇到网络问题,检查主机的网卡共享设置是否正确。

5.3 性能优化建议

经过多次测试,我发现这些优化措施效果明显:

  1. 使用KVM加速(需Windows11开启Hyper-V)
  2. 为虚拟机分配更多CPU核心
  3. 使用virtio磁盘和网络设备
  4. 调整QEMU的线程调度策略

具体优化命令示例:

qemu-system-aarch64 -accel whpx -cpu cortex-a72 -smp 8 ...

6. 常见问题排查

6.1 启动卡在UEFI界面

如果启动时一直停留在UEFI shell界面,通常是-bios参数指定的路径不对,或者UEFI固件文件损坏。建议重新下载QEMU_EFI.fd文件。

6.2 网络连接失败

网络问题最常见的原因是:

  1. 主机网卡共享未正确配置
  2. 防火墙阻挡了连接
  3. 虚拟机内未启用网卡

可以依次检查:

  • 主机网络连接中的共享状态
  • 虚拟机内的IP地址是否获取成功
  • 尝试ping主机和外部网络

6.3 图形界面卡顿

ARM模拟的图形性能确实有限,建议:

  1. 降低显示分辨率
  2. 使用SSH连接代替图形界面
  3. 增加虚拟机内存分配
  4. 尝试不同的显示设备参数

7. 进阶开发配置

7.1 交叉编译环境搭建

在x86主机上为ARM交叉编译程序,需要安装交叉编译工具链:

sudo yum install gcc-aarch64-linux-gnu

编译时指定目标平台:

aarch64-linux-gnu-gcc -o hello hello.c

7.2 容器开发支持

openEuler内置了docker支持,可以方便地构建ARM容器镜像:

docker run --rm -it arm64v8/ubuntu bash

这对于测试多架构容器非常有用。

7.3 内核开发调试

QEMU支持内核调试,启动时添加-s -S参数:

qemu-system-aarch64 -s -S ...

然后使用gdb-multiarch连接调试:

gdb-multiarch vmlinux target remote localhost:1234

这套环境我用了大半年,从最初的简单测试到现在已经作为日常ARM开发的标配。虽然初期配置有些复杂,但一旦跑通就非常稳定。特别是对于需要同时开发x86和ARM程序的场景,省去了频繁切换设备的麻烦。

http://www.cnnetsun.cn/news/1811938.html

相关文章:

  • 昆仑通态MCGS与三菱E740变频器通讯实战:搭建高效工业控制链路
  • 记一次综合型流量分析 | 添柴不加火艺
  • YOLO-v8.3保姆级教程:手把手教你搭建工业质检系统
  • MATLAB/simulink小电流系统单相接地故障选线仿真模型(2020a版本) 有中性点不接地
  • OpenAI推百元订阅方案,剑指开发者市场
  • 从代码工厂到智能协作者:AI原生研发组织变革的5阶跃迁模型(附SITS2026评估矩阵V2.1)
  • 从数据采集到回放验证:ADTF 适配 ROS 的 ADAS 测试实践山
  • IIC总线原理与应用全解析
  • 飞腾D2000 BIOS里的“隐藏菜单”:从过温保护到S3电源管理,一次讲清
  • 从波形到协议:深度解析CAN、CAN FD、J1939与CANopen的帧结构与实战对比
  • 别再只用开发板了!用ESP32做一个能联网校时的Wi-Fi电子钟,还能手机设闹钟
  • 从传感器到世界:相机与IMU坐标系转换的实战解析
  • HBase实战:如何快速定位并修复KeeperErrorCode = ConnectionLoss错误
  • Entware社区贡献指南:如何参与项目开发与维护
  • Laravel Valet核心架构解析:理解Nginx、DnsMasq和PHP-FPM的完美协作
  • Argo Events 传感器配置实战:如何定义复杂的事件依赖关系和触发器
  • 为什么92%的AI项目在上线后遭遇备份失效?3个被忽视的元数据一致性陷阱曝光
  • Alibi分布式计算指南:如何用Ray加速大规模模型解释
  • 多媒体应用开发:QmlBook音频视频处理实战指南
  • 2025最权威的五大降AI率助手推荐
  • 通达信DLL插件实战:5分钟搞定热点板块成份股自动筛选(附股池模板)
  • 5款顶级付费墙绕过工具深度横评:Bypass Paywalls Clean脱颖而出
  • 不止于调参:用Stable-Baselines3自定义网络实现更高效的策略学习(以PPO算法为例)
  • 次元画室保姆级入门指南:从文字描述到动漫角色设计
  • 别再只用箱线图了!用Python的LOF算法给你的数据做个‘体检’,轻松揪出隐藏的异常点
  • 龙芯k - 走马观碑组VLLX驱动移植唐
  • FUXA工业监控平台架构深度解析:基于Web的SCADA/HMI系统技术实现与性能优化
  • 板子功能全正常,为什么一做EMC就翻车?
  • 解锁酷睿™ Ultra潜力:OpenVINO™与vLLM协同优化大语言模型本地推理
  • 如何让Switch支持Xbox和PS手柄:sys-con控制器适配终极指南 [特殊字符]