使用QEMU(x86)模拟运行ARM64架构并进行内核调试

这篇具有很好参考价值的文章主要介绍了使用QEMU(x86)模拟运行ARM64架构并进行内核调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 x86 上使用 QEMU 虚拟机模拟并调试 ARM64。
参考:ubuntu虚拟机中使用QEMU搭建ARM64环境

准备工作

  • 主机 ubuntu 20.04, Linux 5.16.0
  • QEMU emulator version 7.2.92 (v8.0.0-rc2-23-gefcd0ec14b) :qemu-7.2.29
  • 合适的ARM64内核源码:linux-4.14.221.tar.gz
  • 安装交叉编译工具:sudo apt-get install gcc-aarch64-linux-gnu

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86

安装 QEMU

命令安装以及源码安装均不支持树莓派4B平台

  1. 命令安装qemu:sudo apt install qemu-system-armqemu-system-aarch64 --help
  2. 采用编译安装方式安装 qemu-5.2.0/qemu-7.2。
  3. 注意环境变量:export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

但是,命令安装不支持树莓派4。

jiaming@jiaming-pc:~/Documents/jailhouse-rpi4$ qemu-system-aarch64 -M ?
Supported machines are:
...
raspi2               Raspberry Pi 2
raspi3               Raspberry Pi 3
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
...
  1. 采用编译安装方式安装 qemu-5.2.0/qemu-7.2。

安装 ninja。

git clone https://github.com/ninja-build/ninja.git && cd ninja
./configure.py --bootstrap
cp ninja /usr/bin/
  • qemu-5.2.0
  • qemu-7.2.29
./configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-debug
make -j4
make install

使用 debootstrap 制作根文件系统

安装软件包

$ sudo apt-get install bison flex bc build-essential libncurses* libssl-dev
$ sudo apt-get install  qemu-user-static binfmt-support debootstrap

初始化根文件系统

$ sudo su - root
$ debootstrap --arch=arm64 --foreign buster linux_rootfs http://mirrors.ustc.edu.cn/debian/ # linux_rootfs:本地目录,最后制作好的文件系统会在此目录
$sudo cp /usr/bin/qemu-aarch64-static ./linux_rootfs/usr/bin/
$ sudo chroot linux_rootfs/ debootstrap/debootstrap --second-stage

进入根文件系统

$ chroot linux_rootfs/

配置root用户密码

passwd root

添加用户以及设置密码

useradd -G sudo -m -s /bin/bash XXX
passwd XXX

设置主机名

echo XXX-PC > /etc/hostname

设置网络

$ echo "auto lo" > /etc/network/interfaces
$ echo "iface lo inet loopback" >> /etc/network/interfaces
$ echo "allow-hotplug enp0s1" > /etc/network/interfaces
$ echo "iface enp0s1 inet dhcp" >> /etc/network/interfaces

安装依赖

$ apt update
$ apt install net-tools build-essential

制作ext4文件系统

$ dd if=/dev/zero of=linux_rootfs.ext4 bs=1M count=2048

使用 mkfs.ext4 命令格式化:

$ mkfs.ext4 linux_rootfs.ext4

挂载并拷贝内容:

$ mkdir -p tmpfs
$ sudo mount -t ext4 linux_rootfs.ext4 tmpfs/ -o loop
$ sudo cp -af linux_rootfs/* tmpfs/
$ sudo umount tmpfs
$ sudo chmod 777 linux_rootfs.ext4

内核编译

$ cd linux-4.14.221/
$ export ARCH=arm64 ROSS_COMPILE=aarch64-linux-gnu-
$ make defconfig
$ make -j4

编译内核时开启 CONFIG_GDB_SCRIPTS,关闭 CONFIG_DEBUG_INFO_REDUCED。 如果架构支持 CONFIG_FRAME_POINTER,请保持开启。

编译成功后,在 arch/arm64/boot/ 目录下生成 Image 文件。

QEMU 模拟 ARM64 架构启动

启动命令:

qemu-system-aarch64 \
-m 1024 \
-cpu cortex-a57 \
-M virt -nographic \
-smp 4 \
-kernel linux-4.14.221/arch/arm64/boot/Image \
-append "noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8" \
-drive if=none,file=linux_rootfs.ext4,id=hd0 \
-device virtio-blk-device,drive=hd0 
  • qemu-system-aarch64: QEMU 指令,用于启动一个 AARCH64 虚拟机。
  • -m 1024 : 设置虚拟机的内存大小为 1GB。
  • -cpu cortex-a57 : 执行虚拟机使用的CPU型号 A57。
  • -M virt -nographic : 设置 QEMU 为虚拟化模式,并且不显示图形界面。
  • -smp 4 : 设置虚拟机支持的最大线程数目为 4。
  • -kernel linux-4.14.221/arch/arm64/boot/Image : 指定要加载的 Linux 内核文件。
  • -append "noinintrd sched_debug root=/dev/vda rootfstype=ext4 rw crashkernel=256M loglevel=8": 添加内核参数,以启用 noinintrd sched_debug 调试选项,并将根目录设置为 VDA 中的 /dev/vda。
  • if=none,file=linux_rootfs.ext4,id=hd0: 指定要使用的存储设备为 IDE 控制器上的 HD0 设备,文件名为 linux_rootfs.ext4。
  • -device virtio-blk-device,drive=hd0 : 指定要使用的 virtio blk 设备,用于存储设备。

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86至此,模拟环境搭建完毕!

调试

交叉编译 strace 并安装

  • strace

生成编译引导文件

./bootstrap

arm64交叉编译

./configure CC=aarch64-linux-gnu-gcc LD=aarch64-linux-gnu-ld --host=aarch64-linux --enable-mpers=no

编译

make LDFLAGS+="-static -pthread"

添加至根文件系统

sudo mount -t ext4 linux_rootfs.ext4 tmpfs/ -o loop
sudo cp -af strace/src/strace tmpfs/bin/
sudo umount tmpfs

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86strace 使用:linux strace 命令

交叉编译 gdb 并安装

不支持 gui。

  • gdb-8.0
  • sudo apt-get install g++-9-aarch64-linux-gnu
export CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++-9
cd gdb-8.0/
mkdir gdb-build
./configure --host=aarch64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux- --prefix=/home/jiaming/Documents/jailhouse-rpi4/qemu-arm64/gdb-8.0/gdb-build
make
sudo make install
sudo cp /usr/aarch64-linux-gnu/lib/* /lib/

出现编译错误以及解决方案:https://blog.csdn.net/weixin_44602409/article/details/115716913

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86
vim ~/.bashrc,添加:

export PATH=$PATH:/home/jiaming/Documents/jailhouse-rpi4/qemu-arm64/gdb-8.0/gdb-build/bin

调试内核

  1. QEMU 命令启动内核,加入 -S -s 参数。
  • -S 就是挂起gdbserver,让 gdb 工具远程连接。
  • -s 默认使用1234端口进行远程调试

内核启动挂起,等待 gdb 连接。

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86

  1. 新的命令窗口中,启动 gdb 命令 jiaming@jiaming-pc:~/Documents/jailhouse-rpi4/qemu-arm64/linux-4.14.221$ aarch64-linux-gdb vmlinux,并使用默认端口连接,target remote localhost:1234

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86退出 gdb 工具后,内核继续启动,输出启动信息。

后记

  1. 当编译过程中出现 ld 错误时,可以考虑更换编译器版本。make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- LD=/home/jiaming/gnu/aarch64/lin/aarch64-linux/bin/aarch64-linux-gnu-ld
    亦或者,全部指定:
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar install
  1. qemu 目前最新版本不支持 rpi4 平台模拟。
  2. 在gparted工具中,发现磁盘均是灰色的,说明磁盘已经被挂载了,实际上不需要挂载。

使用 busybox

  • busybox-1.29.0
  • 安装交叉编译工具链(linaro-7.5),默认的 9.x 版本编译出错。
wget  https://busybox.net/downloads/busybox-1.29.0.tar.bz2
tar -xjf busybox-1.29.0.tar.bz2
cd busybox-1.29.0
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar menuconfig
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar
make ARCH=arm64 CROSS_COMPILE=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- CC=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc LD=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ld AR=/home/jiaming/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar install
dd if=/dev/zero of=busybox-1.29.0-rootfs_ext4.img bs=1M count=100 oflag=direct
mkfs.ext4 busybox-1.29.0-rootfs_ext4.img
mkdir rootfs
sudo mount busybox-1.29.0-rootfs_ext4.img rootfs/
sudo cp -raf busybox-1.29.0/_install/* rootfs/

cd rootfs
sudo mkdir -p proc sys tmp root var mnt dev
sudo mknod dev/tty1 c 4 1
sudo mknod dev/tty2 c 4 2
sudo mknod dev/tty3 c 4 3
sudo mknod dev/tty4 c 4 4
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo cp -r ../busybox-1.29.0/examples/bootfloppy/etc/ .

cd ..
sudo umount rootfs

QEMU 启动命令:qemu-system-aarch64 -m 1024 -cpu cortex-a57 -machine virt,gic-version=3,virtualization=on -kernel Image -append "console=ttyAMA0 root=/dev/vda init=/linuxrc rw" -hda busybox-1.29.0-rootfs_ext4.img -monitor stdio

挂载 /dev/vda 作为根文件系统,需要在内核中配置如下选项

CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_PCI=y
CONFIG_EXT4_FS=y

否则会出现该错误:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,0)

QEMU 启动时弹出新的窗口

安装 sdl

安装 sdl: https://blog.csdn.net/qq_22948593/article/details/109740372,不需要交叉编译。
https://www.libsdl.org/release/SDL2-2.0.14.tar.gz

重新安装 QEMU

./configure --target-list=aarch64-softmmu,aarch64-linux-user --enable-debug --enable-sdl
make -j4
make install

-nographic 参数:

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86

-nographic 参数:

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86
-nographic 参数,加入 -monitor stdio 参数:

虚拟机模拟arm架构,学习杂记,QEMU,ARM64,Linux内核,调试,x86q 退出。文章来源地址https://www.toymoban.com/news/detail-699493.html

到了这里,关于使用QEMU(x86)模拟运行ARM64架构并进行内核调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • X86架构下交叉编译arm64源代码

    glibc在/lib(/lib32 /lib64)目录下的.so文件为libc.so.6 glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有

    2023年04月21日
    浏览(49)
  • windows-x86使用qemu打开x86和arm虚拟机

     下载固件(UEFI固件镜像文件,BIOS的替代方案) ) 使用cmd执行qemu命令,配置好环境变量比较方便 准备好一个x86的镜像或者arm的镜像,格式可以为qcow2 打开cmd,执行命令 x86 arm 注:上面字段含义  -m 8192 : 分配8GB内存  -cpu cortex-a72 : 虚拟CPU为ARM Cortex-A72 -smp 8,sockets=4,cores=2 : 虚

    2024年02月16日
    浏览(45)
  • 在x86下运行的Ubuntu系统上部署QEMU用于模拟RISC-V硬件系统

    下载地址: 建议选择stable版本,arch选择riscv64-lp64d,libc选择常用的glibc。 下载后解压,然后将bin目录加入PATH环境变量中。 下载地址: 建议选择稳定版本,下载后解压,然后make --enable-virtfs 用户虚拟机和宿主机之间共享文件 Linux内核下载地址: 选择稳定的版本,下载完后解

    2024年02月13日
    浏览(54)
  • 在x86机器上的Docker运行arm64容器

    工作中常用电脑主机CPU为x86架构,有时由于产品需要,我们需要编译aarch64架构的SDK或者应用程序供使用或者测试。 一种比较快捷的方式是使用aarch64的CPU构建相应操作系统,实现真机运行。但在无arm架构CPU环境下,我们可否x86配合相应软件模拟aarch64指令集,实现程序的正常运

    2024年02月06日
    浏览(57)
  • arm和x86架构服务器拉取arm64架构的docker镜像

    dockerhub提供的镜像部分支持arm64架构 Docker arm架构服务器拉取docker镜像,默认是arm架构  查看docker镜像的架构 x86平台拉取arm平台的docker镜像 对docker版本有限制 docker运行其他平台容器,需要使用--platform参数指定容器 docker19.03.9及以上版本才支持--platform参数 查看是否开启experi

    2024年01月20日
    浏览(60)
  • 基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机_centos7 arm 网络配置

    【原文连接】基于x86架构的CentOS7虚拟机通过qemu安装ARM架构CentOS7虚拟机_centos7 arm_redrose2100的博客-CSDN博客 试过很多版本的在win10系统直接qemu安装arm版linux都失败了,也看到了别人也说这个方式不行得用虚拟机套虚拟机才行的方式,因为我没有ubunto所以搜到大佬的centos虚拟机套

    2024年02月09日
    浏览(61)
  • 【docker】x86主机在docker中运行arm64镜像

    1、在x86搭建arm64 ros的开发环境。 2、宿主机:虚拟机x86_ubuntu18 3、设备:jetson agx xavier(jetpack4.6.1) jetson已安装各种软件环境 打包jeston文件系统 把U盘插到jetson,然后执行打包命令。 --exclude是排除不需要打包的文件 2、x86加载docker文件 a、打包完成后,将U盘插到pc主机 b、将文

    2024年02月05日
    浏览(39)
  • ubuntu22.04 x86环境上使用QEMU搭建arm虚拟机

    apt-get -y install qemu apt-get -y install bridge-utils apt-get -y install vnc4server apt-get -y install qemu-kvm apt install -y qemu-system-arm apt-get -y install libvirt0 apt-get -y install libvirt-daemon apt-get -y install libvirt-daemon-system 安装完成后检查: virsh version ls /usr/bin/|grep qemu wget http://releases.linaro.org/components/kernel/

    2024年02月07日
    浏览(84)
  • x86 32 64 Arm这些听过但不懂,都是什么?是架构还是系统?一文梳理

    x86 听过吗? 64位操作系统知道吧 和x86什么关系 32和64都是什么东西? 曾经的我也一头雾水,今天我才来整理一下,惭愧惭愧! 今天带着沉重的心情来梳理一下学习内容吧 如果你很熟悉很了解计算机的话,应该知道,处理器、操作系统、驱动、软件都有32位和64位之分,只不

    2024年04月29日
    浏览(54)
  • openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

    随着国产化的普及,国家政策对信创产业的支持,尤其一些金融证券行业、政府单位等,逐渐开始走国产化信创的路线,越来越多接触到国产 CPU ( arm  平台,比如华为的鲲鹏处理器) 自己买  arm  平台的  CPU ,这个成本着实吃不消,于是尝试  x86  平台运行  arm  平台的

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包