Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Windows平台使用QEMU搭建ARM+Linux开发环境

Windows平台使用QEMU搭建ARM+Linux开发环境

作者头像
乱码三千
发布于 2021-08-24 07:24:10
发布于 2021-08-24 07:24:10
11.7K00
代码可运行
举报
文章被收录于专栏:乱码三千乱码三千
运行总次数:0
代码可运行

起因

由于目前市面上很多模拟器诸如夜神,网易MUMU,基本上使用的是x86的架构,虽然运行ARM程序没有问题,但是如果想使用gdb对ARM程序进行调试的话,就显得力不从心了,各种问题层出不穷,

当然调试x86程序是没有问题的,

如果非要对ARM程序进行gdb调试的话,可以采用Android Studio原生的模拟器(原生ARM太卡),但是考虑到很多人并不是从事安卓开发,加上Studio中的模拟器本就基于QEMU, 那么为了方便,我们直接搭建QEMU的环境

实验环境

  • Windows宿主平台
  • QEMU安装包(这里使用的是20201124的版本):https://qemu.weilnetz.de/w64/
  • 树莓派系统镜像:http://downloads.raspberrypi.org/raspbian/images/raspbian-2020-02-14/ 树莓派是基于DebianLinux系统

操作步骤

QEMU下载安装完毕后,其安装目录会包含很多不同架构的执行文件,这里我们选择qemu-system-arm.exe,打开命令窗口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-system-arm.exe -machine versatilepb -L  -m 128  -hda 2020-02-13-raspbian-buster.img

相关指令选项介绍:

  • -M :指定机器
  • -name:给虚拟系统起个名称
  • -cpu:指定cpu型号
  • -smp :指定cpu的个数 比如-smp 2
  • -m: 指定内存大小单位MB
  • -vga :指定显卡 比如 -vga vmware
  • -hda: 指定硬盘镜像
  • -initrd: 指定 RAM磁盘镜像
  • -fda : 指定软盘镜像
  • -L:bios位置
  • -cdrom:光盘镜像
  • -no-reboot: 不重启退出
  • -kernel :指定内核文件
  • -serial :设置串口 比如:-serial stdio 表示 重定向Guest 的串口到Host的标准输入输出
  • -boot :启动模式 一共有三种 , 分别为floppy(a), hard disk(c), CD-ROM(d)

上面这条指令显然无法启动系统,因为还缺少了相应kernel-qemu文件和配置:

kernel-qemu下载

GitHub - dhruvvyas90/qemu-rpi-kernel: Qemu kernel for emulating Rpi on QEMU

我们选择里面的versatile-pb-buster.dtbkernel-qemu-5.4.51-buster 这两个文件进行下载,这是和系统版本一一对应的。下载后最好放在qemu的安装目录

然后输入以下指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-system-arm -M versatilepb -cpu arm1176 -m 256 -drive "file=系统镜像路径,if=none,index=0,media=disk,format=raw,id=disk0" -device "virtio-blk-pci,drive=disk0,disable-modern=on,disable-legacy=off" -net "user,hostfwd=tcp::5022-:22" -dtb versatile-pb-buster.dtb -kernel kernel-qemu-5.4.51-buster -append "root=/dev/vda2 panic=1" -no-reboot -net nic

注意:需要按照以上指令运行,否则有可能出现系统启动不起来的情况 -net nic 可开启网络 方便远程连接 -net "user,hostfwd=tcp::5022-:22" 表示设置端口映射

系统安装完毕后,直接进入树莓派桌面,在弹出的设置窗口中可以更改系统语言为中文, 还可以设置系统密码

至此ARM+Linux环境搭建完毕

准备开发

接下来我们通过ssh连接树莓派终端,打开cmd命令窗口,输入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ssh pi@127.0.0.1 -p 5022

回车后会提示输入密码,这里输入之前设置的系统密码

此时就进入树莓派的Linux终端,为什么不直接使用qemu中的LX终端? 还不是因为模拟器延迟卡顿

如果想往树莓派中传输文件,可以直接使用ftp工具,比如FileZilla或者 SecureCRT 选择sftp或者ssh2模式,其登陆参数如下:

  • 主机:127.0.0.1
  • 用户名:pi
  • 端口:5022,
  • 密码同上

程序调试

紧接着使用gdb+gdbserver对C程序进行调试

首先利用ftp工具将已经编译好的可执行文件和GCC包下arm-none-linux-gnueabi\libc\usr\bin目录中的gdbserver传送到模拟器中

然后执行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./gdbserver :22349 test

开始监听端口, 但是问题来了,该模拟器的ip不在局域网段上,导致宿主机连接不上, 如果你也出现同样的问题,可以采用端口映射的办法来替代,方法很简单,只需要在模拟器启动时多追加加上一行参数hostfwd=tcp::22349-:22349,具体启动指令修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-system-arm -M versatilepb -cpu arm1176 -m 256 -drive "file=2020-02-13-raspbian-buster.img,if=none,index=0,media=disk,format=raw,id=disk0" -device "virtio-blk-pci,drive=disk0,disable-modern=on,disable-legacy=off" -net "user,hostfwd=tcp::5022-:22,hostfwd=tcp::22349-:22349" -dtb versatile-pb-buster.dtb -kernel kernel-qemu-5.4.51-buster -append "root=/dev/vda2 panic=1" -no-reboot  -net nic

如此一来就可以在宿主gdb调试窗口中直接使用以下指令进行连接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(gdb) target remote 127.0.0.1:22349

连接成功了,通过以上这种方式,我们只需要将模拟器启动使其后台运行,我们通过ssh进行登录连接,这样速度快了很多,而且相比一些安卓模拟器,QEMU占用系统资源也不高

另外我们发现,还存在声卡缺失,同时运行有延迟卡顿现象,我们接下来对这两方面进行优化

小问题

如果是raw格式,可能会有些风险警告,可以通过-drive format=raw进行指定处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-system-arm.exe  -machine raspi2b -drive file=2020-02-13-raspbian-buster.img,format=raw,index=0,media=disk

附加内容

查看cpu信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lscpu

查看系统和内核版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uname -a

镜像备份模式

随着我们对系统的频繁操作我们发现系统镜像文件在不断增大,此时想要回到原来的状态,只能重新下载镜像安装了,如果你不想遭受重新下载的痛苦,那么建议你使用备份镜像的模式进行系统的安装

这时qemu-img.exe派上了用场,它不仅可以帮助你创建空镜像文件,而且还可以对已有的镜像文件进行格式转换,QEMU支持的镜像有以下:

Image format

Argument for -f and -O options

VMDK (VMware)

vmdk

QCOW2 (KVM, Xen)

qcow2

VHD (Hyper-V)

vpc

VHDX (Hyper-V)

vhdx

RAW

raw

VDI (VirtualBox)

vdi

qemu-img 支持非常多种的文件格式,可以通过 qemu-img -h 查看. 其中 rawqcow2 是比较常用的两种, rawqemu-img 命令默认的,qcow2qemu 目前推荐的镜像格式,是功能最多的格式

创建空镜像文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-img create -f qcow2 test.qcow2 10G
  • -f 选项用于指定镜像的格式,
  • qcow2 格式是 QEMU最常用的镜像格式,采用来写时复制技术来优化性能。
  • test.qcow2 是镜像文件的名字,
  • 10G是镜像文件最大值

镜像转换:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-img.exe  convert -f raw system.img -O vmdk  system.vmdk

表示将原始格式的镜像文件转换成vmdk格式

使用备份镜像的方式启动镜像示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qemu-system-x86_64 -m 2048 -enable-kvm test.qcow2 -cdrom Centos-Desktop-x86_64-20-1.iso

附加镜像

  • openwrt:https://archive.openwrt.org/chaos_calmer/
  • Debian系统镜像:https://people.debian.org/~aurel32/qemu/
  • 谷歌安卓原生镜像:https://developers.google.cn/android/images
  • 树莓派x86镜像: https://www.raspberrypi.org/downloads/raspberry-pi-desktop/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱码三千 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在 Mac M1 Pro 上 debug Linux Kernel | 基于 Ubuntu 24 工具链和 QEMU
在 MacOS 上直接编译 Linux Kernel 在我看来并不是一个很好的选择:
Piper破壳
2025/04/20
840
如何在 Mac M1 Pro 上 debug Linux Kernel | 基于 Ubuntu 24 工具链和 QEMU
使用 qemu-img 转换镜像格式
qemu-img镜像格式转换工具支持vhd、vmdk、qcow2、raw、vhdx、qcow、vdi或qed社区格式的镜像的相互转换。
宋天伦
2023/10/20
2K0
QEMU-IMG入门教程
一台虚拟机的核心就是一个磁盘镜像,这个镜像可以理解成虚拟机的磁盘,里面有虚拟机的操作系统和驱动等重要文件,qemu-img就是quemu创建管理磁盘镜像的工具。
zhangheng
2020/04/28
12.6K0
Qemu搭建arm版麒麟系统
麒麟系统(Kylin)是由中国科学院计算技术研究所(ICT)开发的一款操作系统。它最初是为满足中国国家信息化建设需求而创建的,旨在提供一个安全可靠、高性能的操作系统平台,广泛应用于中国政府、军队、企事业单位等领域。 麒麟系统基于Linux内核进行开发,并在其上构建了自己的软件堆栈和应用程序生态系统。作为一个综合性操作系统,麒麟系统支持多种硬件架构,包括ARM架构。 模拟ARM平台安装麒麟系统是指在非ARM架构的计算机上使用虚拟化技术模拟ARM架构,然后在模拟的ARM平台上安装和运行麒麟系统。这种方法可以让开发人员、研究人员或爱好者在不拥有实际ARM设备的情况下,通过模拟器来体验和测试麒麟系统。 常用的模拟器之一是QEMU(Quick Emulator),它是一个开源的虚拟化和仿真工具,支持多种硬件架构的模拟。通过在QEMU上配置合适的硬件参数和设备模拟,可以在模拟的ARM平台上运行麒麟系统。 模拟ARM平台安装麒麟系统可以帮助开发人员和用户熟悉和测试麒麟系统的功能和性能,进行应用程序的开发和调试,以及进行系统优化和性能调优等工作。此外,这种方法还能够提供一个便捷的环境,使用户能够在常用的计算机上尝试和学习ARM架构相关的开发和应用。 需要注意的是,模拟器虽然提供了一种方便的方式来模拟ARM平台,但由于模拟器的性能和硬件差异,与实际ARM设备上的运行可能会存在一些差异。因此,在进行实际产品开发或性能评估时,还应该在真实的ARM硬件上进行测试和验证。
默 语
2024/11/20
4950
Qemu搭建arm版麒麟系统
「  【QEMU】谈谈如何在linux系统上面搭建虚拟机  」
想要在Ubuntu或者其他linux系统上面搭建虚拟机吗,那就看看吧,最近一段时间闲着没事干,在服务器上面挂qemu虚拟机启动Windows,只是单纯的觉得很好玩(.....)
青益
2023/01/03
1.3K0
树莓派 qemu模拟启动,构建arm环境;RASPBERRY PI ON QEMU
教程:https://azeria-labs.com/emulate-raspberry-pi-with-qemu/
西湖醋鱼
2021/08/05
1.8K1
使用QEMU模拟树莓派Raspberry Pi
被誉为 “世界上最流行最便宜的小型电脑” 的「树莓派」Raspberry Pi 是一款性价比超高的迷你电脑主机 (仅有信用卡大小), 深受全球开发者、极客、技术爱好者们的追捧和喜爱
yuanfan2012
2020/08/25
9.5K1
使用QEMU模拟树莓派Raspberry Pi
在 UOS 下利用 QEMU 搭建飞腾 ARM64 的开发环境
近年来,在政府的推动下,国产操作系统(主要是统信 UOS 和麒麟 OS)以及相关软件的市场份额不断扩大。越来越多的企业和事业单位开始采用国产操作系统和软件,国产化替代进程正如火如荼地进行。目前,信创产业链上下游百花齐放,国产芯片领域更是群雄并起,如麒麟、兆芯、海光、龙芯、飞腾、申威等。作为产业链中的一环,软件开发者也面临一个普遍问题:需要适配多种硬件平台。
云水木石
2025/01/23
4810
在 UOS 下利用 QEMU 搭建飞腾 ARM64 的开发环境
kvm qcow2,raw 磁盘格式、磁盘存储策略介绍
raw格式是原始镜像,直接将数据写入磁盘,没有额外的元数据或压缩,由于没有复杂的元数据处理,raw 格式通常比较快,适用于一些对性能要求较高的场景。相对于 qcow2,raw 格式通常不支持虚拟机的快照功能。每个虚拟机实例都需要完整的磁盘空间,不同虚拟机之间不能共享相同的基础数据。
Kevin song
2023/12/04
3.1K0
kvm qcow2,raw 磁盘格式、磁盘存储策略介绍
Qemu 简述
Qemu 架构 Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,我们最熟悉的就是能够模拟一台能够独立运行操作系统的虚拟机,虚拟机认为自己和硬件打交道,但其实是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。 正因为 Qemu 是纯软件实现的,所有的指令都要经 Qemu 过一手,性能非常低,所以,在生产环境中,大多数的做法都是配合 KVM 来完成虚拟化工作,因为 KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 Qemu 则负责 I/O
Linux云计算网络
2018/01/11
3.7K0
Qemu 简述
Android termux免root安装docker
https://zsxwz.com/2022/03/05/termux%e5%85%8droot%e5%ae%89%e8%a3%85docker/
治电小白菜
2024/02/05
4K0
搭建qemu RISC-V运行Linux环境
目前虽然RISC-V的硬件开发板能够运行Linux的十分难得,从探索RISCV的生态的角度上来看,使用模拟器也是一种非常好的方式。使用QEMU能够很好的模拟RISCV的硬件资源,后期有实际的开发板后将其软件生态移植上去也并不复杂。
bigmagic
2021/05/18
10.4K13
搭建qemu RISC-V运行Linux环境
使用树莓派构建嵌入式C++调试环境
本文以使用树莓派4b为例说明构建嵌入式C++执行环境。树莓派本身可以到各大购物网站直接购买,价格大概300-500元不等。之所有选择树莓派是因为它的系统比较完善,容易上手。但是需要实现说明的是本文说明的大部分内容并不仅限于树莓派。
面向对象思考
2020/03/25
1.8K0
使用树莓派构建嵌入式C++调试环境
QEMU 1: 使用QEMU创建虚拟机
一、QEMU简介# QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机监管器,模拟全系统,利用其他VMM(Xen, KVM, etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机。 用户可以通过不同Linux发行版所带有的软件包管理器来安装QEMU。如在Debian系列的发行版上可以使用下面的命令来安装: sudo apt-ge
宅蓝三木
2018/02/07
10.8K0
QEMU 1: 使用QEMU创建虚拟机
【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置
对于很多程序员而言,树莓派如今已经如雷贯耳,对于我一个新入行AI领域研究的新人而言,树莓派激发了我极大的兴趣。最开始知道树莓派,是因为我之前做了一个语音对话机器人,然后在查询有关资料的时候发现有人用树莓派做了一个语音对话机器人,于是乎很惊奇,心中一直想自己动手实验一下。刚好那时候听说树莓派4B新上市,各方面的性能至少提升了3倍以上,好奇心害死猫,所以我决定入坑树莓派了。
全栈程序员站长
2022/07/01
9.1K0
【树莓派】树莓派4B新手篇:安装官网Raspbian Buster系统及基础配置
高效搭建树莓派3b rt-thread的开发环境
由于电子设备的普及,越来越多人拥有树莓派,不管是作为电子极客,还是作为普通普通人,很多人都会玩一下树莓派,可以学习一些c语言,也可以学习嵌入式。下面我来介绍一下如何在树莓派上运行rt-thread rtos。
bigmagic
2020/03/17
3.3K0
KVM虚拟机差量生产镜像测试
后备镜像差量生成虚拟机的方式可以快速的产生大量的虚拟机,节省磁盘空间,在生产环境中有非常重要的意义。经过测试,对后备镜像的读压力非常小,系统压力主要在差量镜像的写压力,使用的时候,为了取得良好效果,应将后备镜像和差量镜像分散到不同的物理硬盘上,并保证镜像的安全性。
力哥聊运维与云计算
2019/06/28
8100
KVM虚拟机差量生产镜像测试
使用kvm制作OpenStack平台Windows镜像
关于virtio: kvm因为使用了硬件虚拟化,所以其cpu方面的运行效率是很高的。不过,kvm在I/O虚拟化方面,传统的方式是利用QEMU纯软件的方式来模拟I/O设备, 这样每次虚机发起I/O请求的时候,KVM内核模块会捕获这次请求,然后处理后将其放入I/O共享页,并通知用户空间中运行的QEMU程序。 QEMU获得I/O操作,交由硬件模拟代码(Emulation)来模拟出本次I/O操作之后,将结果放回I/O共享页,同时通知KVM内核模块读取I/O共享页的操作结果,把结果返回给虚机。 由于这种方式每次I/O操作经过的路径很复杂,其效率很低。所以就提出了virtio这种方案,virtio其实就是一个运行于Hypervisor之上的api接口, 让客户机知道自己运行于虚拟化环境中,进行I/O操作的时候通过virtio与Hypervisor通信,从而是虚机有更好的性能。
用户9949933
2023/02/24
2.9K0
申威欧拉虚拟机启动
首先需要确保hmcode是1.20版本,然后修改/boot/grub/grub.cfg文件,内核参数改为:
风起--追风
2024/01/31
4010
KVM镜像管理利器-guestfish使用详解
1. 虚拟机镜像挂载及w2k8虚拟机启动自检慢问题解决办法 2. KVM虚拟化与guestfish套件 3. guestfish安装与注意事项 4. 使用guestfish查看虚拟机信息 5. 使用guestfish查看虚拟机分区及文件系统 6. 去掉磁盘空洞--KVM虚拟镜像的稀疏问题 7. 用guestfish操作虚拟机内部文件 8. guestfish修改镜像格式和大小 9. guestfish挂载、修改、运行救援方式
力哥聊运维与云计算
2019/06/28
3.4K0
相关推荐
如何在 Mac M1 Pro 上 debug Linux Kernel | 基于 Ubuntu 24 工具链和 QEMU
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验