专栏首页乱码三千Windows平台使用QEMU搭建ARM+Linux开发环境

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

起因

由于目前市面上很多模拟器诸如夜神,网易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/ 树莓派是基于Debian的Linux系统

操作步骤

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

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的安装目录

然后输入以下指令:

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命令窗口,输入:

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传送到模拟器中

然后执行以下命令:

./gdbserver :22349 test

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

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调试窗口中直接使用以下指令进行连接:

(gdb) target remote 127.0.0.1:22349

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

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

小问题

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

qemu-system-arm.exe  -machine raspi2b -drive file=2020-02-13-raspbian-buster.img,format=raw,index=0,media=disk

附加内容

查看cpu信息:

lscpu

查看系统和内核版本:

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 目前推荐的镜像格式,是功能最多的格式

创建空镜像文件:

qemu-img create -f qcow2 test.qcow2 10G
  • -f 选项用于指定镜像的格式,
  • qcow2 格式是 QEMU最常用的镜像格式,采用来写时复制技术来优化性能。
  • test.qcow2 是镜像文件的名字,
  • 10G是镜像文件最大值

镜像转换:

qemu-img.exe  convert -f raw system.img -O vmdk  system.vmdk

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

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

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/

本文分享自微信公众号 - 乱码三千(infree6),作者:有瓣知识

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一步步教你:在x86平台,如何用Qemu来模拟ARM系统

    前一段时间因为工作需要,我对ARM模拟器进行了一番调研。调研目的是:由于项目参与人员比较多,如果人手一块ARM开发板,资源比较紧张,希望能够用模拟器来代替。

    IOT物联网小镇
  • 嵌入式开发中常用的虚拟机与容器

    嵌入式开发已经从以往的单片机开发逐渐过渡到越来越依赖Linux的系统。虽然大多数情况下,windows的开发工具可以做很多嵌入式开发工作,也有很多好用的工具,但...

    bigmagic
  • Ubuntu上搭建arm虚拟运行环境

    没有开发板,如何调试运行arm程序? 本文主要讲解如何在Ubuntu上搭建arm交叉编译、运行环境。

    coderhuo
  • VVの嵌入式(一)开发环境搭建

    平台:Ubuntu32位虚拟机 目标平台:海思Hi3559V100 工欲善其事必先利其器,在进行嵌入式linux开发的时候需要搭建一个能够调试的环境,在电脑...

    Pulsar-V
  • Linux Lab v0.5 正式发布,功能强大,用法简单

    Linux Lab 是一套用于 Linux 内核学习、开发和测试的即时实验室,可以极速搭建和使用,功能强大,用法简单!

    IT大咖说
  • riscv64 qemu上进行Linux环境搭建与开发记录

    最近在学习riscv64架构的一些知识,并且利用做一些项目的机会去了解更多的不同种类的的芯片的架构设计。学习riscv的好处在于其架构是开源的,也就是任何人只要...

    bigmagic
  • 跨平台构建 Docker 镜像新姿势,x86、arm 一把梭

    在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上。特别是 Docker 席卷全球之...

    米开朗基杨
  • Windows平台搭建React Native开发环境

    尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 告诉大家一个好消息,为大家精心准备的React N...

    CrazyCodeBoy
  • 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索。终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核。如下详细解释整个构建过程。

    RainMark
  • 重现 TP-Link SR20 本地网络远程代码执行漏洞

    3月26号 Google 安全开发人员 Matthew Garrett 在 Twitter 上公布了 TP-Link Smart Home Router (SR...

    Seebug漏洞平台
  • Hypervisor, KVM, QEMU总结

    Hypervisor——一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine ...

    战神伽罗
  • DLink RCE漏洞CVE-2019-17621分析

    上一篇文章分了一下ARM系统的路由器漏洞,本次打算尝试一下MIPS系统,于是选了最近DLink路由器的漏洞CVE-2019-17621作为目标。同样一路走来各种...

    FB客服
  • 在qemu上搭建开发aarch64 rtos环境

    随着芯片技术的发展,嵌入式已经不再是传统的单片机开发模式,需要一些硬件操作的板子,现在qemu这种模拟硬件的手段非常好,通过直接在电脑上仿真后,然后再移植到真实...

    bigmagic
  • 再也不用花钱买开发板了,自己搭建arm模拟器!

    QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,Pe...

    bigmagic
  • GDB与GDBServer配合实现在安卓设备中进行程序调试

    建议下载Android NDK开发包,然后将里面的GCC套件单独抽出来使用,NDK提供了抽包脚本make-standalone-toolchain,在bulid...

    乱码三千
  • (转)为什么计算机的学生要学习Linux开源技术

    Linux 相关的开源技术对于学生来说,特别是计算机专业的学生来说,非常重要,下面就几个方面进行讨论:

    Fisherman渔夫
  • “骇极杯”——pwn复现详解

    当时在做的时候看见是arm的框架就放弃了,环境都不会搭建简直爆炸了,所以就没有继续做了。复现的时候发现其实搭建环境的思路还是很清晰的。

    安恒网络空间安全讲武堂
  • 使用QEMU chroot进行固件本地调试

    QEMU是我们在调试一些不同架构的程序时经常使用的虚拟机软件。它有两种运行模式,全系统模拟(System mode)和单程序运行(User mode)。Syst...

    绿盟科技研究通讯
  • 使用QEMU搭建ARM64实验环境

    对于Linux爱好者,你是否也有这样的困扰,为了学习Linux而去购买昂贵的开发版,这大可不必,QEMU模拟器几乎可以满足你的需求,足够你去学习Linux,它能...

    用户7244416

扫码关注云+社区

领取腾讯云代金券