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

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

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)

相关文章:

  • DLLNotFoundException:xxx tolua... 错误打印
  • ubuntu22.04+ROS2推荐匹配的gazebo版本
  • LeetCode 每日一题 2023/12/18-2023/12/24
  • python 使用 pip 安装第三方库 导入不成功
  • 【算法设计与分析】——动态规划算法
  • 【docker笔记】docker常用命令
  • 磁盘类型选择对阿里云RDS MySQL的性能影响
  • 硬核实战!mysql 错误操作整个表全部数据后如何恢复?附解决过程、思路(百万行SQL,通过binlog日志恢复)
  • 线段树/区间树(java实现版详解附leetcode例题)
  • MySQL——复合查询
  • 蓝桥杯宝藏排序算法(冒泡、选择、插入)
  • 幺模矩阵-线性规划的整数解特性
  • 使用vue-qr,报错in ./node_modules/vue-qr/dist/vue-qr.js
  • Openwrt AP 发射 WiFi 信号
  • 【Android 13】使用Android Studio调试系统应用之Settings移植(一):编译服务器的配置、AOSP源码的下载、编译、运行
  • 【mysql】环境安装、服务启动、密码设置
  • 4个实用的微服务测试策略
  • Angular Elements 及其运作原理
  • CSS相对定位
  • es6要点
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • java中具有继承关系的类及其对象初始化顺序
  • node学习系列之简单文件上传
  • React Transition Group -- Transition 组件
  • Spark学习笔记之相关记录
  • swift基础之_对象 实例方法 对象方法。
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 关于springcloud Gateway中的限流
  • 关于字符编码你应该知道的事情
  • 区块链技术特点之去中心化特性
  • 驱动程序原理
  • 深度学习在携程攻略社区的应用
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 网络应用优化——时延与带宽
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • MPAndroidChart 教程:Y轴 YAxis
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • #if 1...#endif
  • #vue3 实现前端下载excel文件模板功能
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (14)Hive调优——合并小文件
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4) PIVOT 和 UPIVOT 的使用
  • (C语言)字符分类函数
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (汇总)os模块以及shutil模块对文件的操作
  • (九)c52学习之旅-定时器
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (排序详解之 堆排序)
  • (一)Dubbo快速入门、介绍、使用
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)创业家杂志:UCWEB天使第一步
  • (转)关于如何学好游戏3D引擎编程的一些经验