ubuntu22上使用qemu-system-arm调试linux

发布时间:2023年12月24日

ubuntu22上使用qemu-system-arm调试linux

背景

qemu是用软件模拟硬件解析指令运行的软件,可以模拟arm、arm64、x86等,对于调试linux 内核机制很方便,不用额外购买开发板。由于linux上有对qemu的加速引擎,支持程度更高,且网络上教程居多,所以这里使用virtualbox+ubuntu22虚拟机,在ubuntu上运行qemu进行模拟。

一、安装ubuntu22虚拟机

virtualbox安装:Oracle VM VirtualBox

ubuntu镜像下载:Ubuntu系统下载(清华大学开源软件镜像站)(ubuntu-20.04.1-desktop-amd64.iso)_ubuntu下载-CSDN博客

这里直接选择最新版本ubuntu22,ubuntu虚拟机安装,本文不再赘述,请大家自行搜索。

二、qemu安装

进入ubuntu,安装qemu,因为我们目标架构是arm,所以这里安装qemu-system-arm

sudo apt install qemu-system-arm -y

三、镜像制作

需要下载编译内核,制作根文件系统。

3.1 内核编译

  1. 下载内核源码

这里使用较新的内核版本,5.5.18

wget  http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.5.18.tar.gz 
  1. 安装交叉编译工具链
sudo apt-get install gcc-arm-linux-gnueabi

交叉编译工具链的前缀:arm-linux-gnueabi-

  1. 编译内核

编译5.x的内核,需要安装工具包flex、bison、apt-get install libncurses5-dev

sudo apt-get install libncurses5-dev flex bison -y

编译命令:vexpress配置专门用于qemu仿真。

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

如果想修改配置使用如下命令,注意要带ARCH=arm,否则默认以x86配置。

make menuconfig ARCH=arm

3.2 根文件系统制作

3.2.1 busybox编译

1)下载busybox:

wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2

2)busybox编译

make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm prefix=${PWD} install

3)copy busybox产物到rootfs临时目录

mkdir -p rootfs/{dev,etc/init.d,lib,proc,sys,/dev/pts,/dev/shm,tmp,run} 
cp busybox-1.36.0/_install/* rootfs/ -rf
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

同时copy的工具链中so到rootfs/lib目录。

3.2.2 启动脚本

1)/etc/inittab

值定init进程执行的启动脚本rcS

::sysinit:/etc/rcS
::askfirst:-/bin/sh

2)内核启动要默认挂载一些调试的fs

如proc、sys、tmp等,这些定义在/etc/fstab,

fstab的解析命令mount -a,需要在rcS中显示调用。

/etc/rcS

# <file system> <mount pt>      <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
devpts          /dev/pts        devpts  defaults,gid=5,mode=620,ptmxmode=0666   0       0
tmpfs           /dev/shm        tmpfs   mode=0777       0       0
tmpfs           /tmp            tmpfs   mode=1777       0       0
tmpfs           /run            tmpfs   mode=0755,nosuid,nodev  0       0
sysfs           /sys            sysfs   defaults        0       0

/etc/rcS:

mount -a
3.2.3 制作镜像

1)生成镜像,128MB即可

qemu-img create -f raw disk.img 128M

2)格式化成ext4

mkfs -t ext4 ./disk.img

3)copy文件到镜像中

mkdir tmpfs 
sudo mount -o loop ./disk.img tmpfs/  
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

四、启动linux

qemu-system-arm -M vexpress-a9 -m 256M -kernel ./linux-5.5.18/arch/arm/boot/zImage -dtb  ./linux-5.5.18/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd disk.img

参考资料

一步步教你:如何用Qemu来模拟ARM系统 - 知乎 (zhihu.com)

QEMU入门指南-CSDN博客

ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs - 知乎 (zhihu.com)

文章来源:https://blog.csdn.net/qq_40036519/article/details/135178528
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。