通过qemu仿真树莓派系统调试IoT固件和程序

通过qemu仿真树莓派系统调试IoT固件和程序

本文将介绍如何使用 QEMU 模拟器在 x86 架构的主机上运行 Raspberry Pi OS(树莓派操作系统)。我们将从下载镜像、提取内核和设备树文件,到启动模拟环境,并进行一些常见的操作,如更改密码和交叉编译,以及如何通过 GDB 进行远程调试。


1. 下载 Raspberry Pi OS 镜像

首先,我们需要下载适用于树莓派的轻量版 Raspberry Pi OS 镜像。本文使用的是 2024-10-22-raspios-bullseye-armhf-lite.img,这是一个基于 Debian Bullseye 的 ARM 架构镜像。

你可以从 Raspberry Pi 官方网站 或其他可信来源下载该镜像。


2. 提取内核和设备树文件

为了在 QEMU 中运行 Raspberry Pi OS,我们需要从镜像中提取内核 (kernel*.img) 和设备树文件 (.dtb)。以下是具体步骤:

2.1 创建挂载点并挂载镜像

# 1. 创建挂载点
sudo mkdir /mnt/rpi# 2. 挂载镜像文件
sudo losetup -f --show -P 2024-10-22-raspios-bullseye-armhf-lite.img
# 假设输出为 /dev/loop0# 3. 挂载第一个分区
sudo mount /dev/loop0p1 /mnt/rpi

2.2 复制内核和设备树文件

# 4. 复制内核和设备树文件
cp /mnt/rpi/kernel* .
cp /mnt/rpi/*.dtb .# 5. 卸载分区
sudo umount /mnt/rpi# 6. 删除 loop 设备
sudo losetup -d /dev/loop0

至此,我们已经成功提取了内核和设备树文件,这些文件将在后续步骤中用于 QEMU 启动。


3. 使用 QEMU 启动 Raspberry Pi OS

3.1 启动树莓派 3B 模拟环境

以下命令将使用 QEMU 模拟树莓派 3B 环境,并加载我们提取的内核和设备树文件:

sudo qemu-system-aarch64 -M raspi3b \
-append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1" \
-dtb ./bcm2710-rpi-3-b-plus.dtb \
-drive format=raw,file=2024-10-22-raspios-bullseye-armhf-lite.img \
-kernel kernel8.img \
-m 1G \
-smp 4 -serial stdio \
-net nic -net user,hostfwd=tcp::5022-:22  \
-usb -device usb-kbd  -device usb-mouse \
-k en-us \
-display sdl 
参数说明:
  • -M raspi3b:指定模拟的硬件平台为树莓派 3B。
  • -append:传递给内核的启动参数,包括根文件系统位置、日志级别等。
  • -dtb:指定设备树文件。
  • -drive:指定镜像文件及其格式。
  • -kernel:指定内核文件。
  • -m:分配内存大小(1GB)。
  • -smp:指定 CPU 核心数(4 核)。
  • -net:配置网络,允许通过 SSH 访问(主机端口 5022 映射到虚拟机端口 22)。
  • -usb:启用 USB 支持,添加键盘和鼠标设备。
  • -display sdl:使用 SDL 图形显示。

运行上述命令后,QEMU 将启动树莓派模拟环境,并进入 Raspberry Pi OS 的登录界面。

在这里插入图片描述


4. 使用预编译的 versatilepb 内核进行仿真

https://github.com/dhruvvyas90/qemu-rpi-kernel

如果你希望使用更通用的 ARM 平台(如 VersatilePB),可以使用以下命令:

qemu-system-arm -M versatilepb -cpu arm1176 -m 256 \
-drive format=raw,file=2024-10-22-raspios-bullseye-armhf-lite.img \
-dtb versatile-pb-bullseye-5.10.63.dtb \
-kernel kernel-qemu-5.10.63-bullseye \
-net nic -net user,hostfwd=tcp::5022-:22  \
-net user,hostfwd=tcp::2333-:2333 \
-nographic \
-append "root=/dev/sda2 panic=1 rootfstype=ext4 rw"
参数说明:
  • -M versatilepb:指定模拟的硬件平台为 VersatilePB。
  • -cpu arm1176:指定 CPU 类型。
  • -nographic:禁用图形界面,仅使用命令行模式。

在这里插入图片描述


4. 更改默认密码

Raspberry Pi OS 新版本需要通过在镜像文件中写入文件进行配置账号密码,否则无法实现登录。

这里我们直接挂载镜像来修改密码

以下是具体步骤:

# 1. 创建挂载点
sudo mkdir /mnt/rpi# 2. 挂载镜像文件
sudo losetup -f --show -P 2024-10-22-raspios-bullseye-armhf-lite.img# 3. 挂载第二个分区
sudo mount /dev/loop0p2 /mnt/rpi# 4. 更改密码
sudo chroot /mnt/rpi passwd pi# 5. 卸载分区
sudo umount /mnt/rpi# 6. 删除 loop 设备
sudo losetup -d /dev/loop0

运行上述命令后,输入新密码即可完成更改。

在这里插入图片描述


5. 交叉编译与远程调试

5.1 交叉编译工具链配置

为了在 x86 主机上为 ARM 架构编译程序,我们需要设置交叉编译工具链。以下是配置示例:

./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf CC=/home/kali/rpi-tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --prefix=/opt/arm-linux-gnueabihf-gdb-8.2make CXX=/home/kali/rpi-tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ CC=/home/kali/rpi-tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc

5.2 使用 GDB 进行远程调试

在目标系统中启动 gdbserver

$ ./gdbserver :2333 /bin/sh

在主机端使用 GDB 连接到目标系统:

gef➤ gef-remote 127.0.0.1 2333

在这里插入图片描述


6. 使用qemu直接进行调试

qemu-aarch64 配合gdb可以实现调试arm架构的程序

# 1. 安装 QEMU User 模式工具
sudo apt install qemu-user gdb-multiarch# 2. 用 QEMU 运行 ARM 可执行程序
qemu-aarch64 <你的ARM程序># 3. 运行 gdbserver 进行远程调试(在主机上执行)
qemu-aarch64 -g 2333 <你的ARM程序># 4. 在另一个终端启动 gdb-multiarch 并连接 gdbserver
gdb-multiarch
gef> set architecture aarch64
gef> gef-remote 127.0.0.1:2333

参考链接

https://zhuanlan.zhihu.com/p/613032457

https://www.gandalf.site/2018/12/iotqemuiot.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35946.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek大模型在政务服务领域的应用

DeepSeek大模型作为国产人工智能技术的代表&#xff0c;近年来在政务服务领域的应用呈现多点开花的态势。通过多地实践&#xff0c;该技术不仅显著提升了政务服务的效率与智能化水平&#xff0c;还推动了政府治理模式的创新。以下从技术应用场景、典型案例及发展趋势三个维度进…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始&#xff0c;提供开箱即用的开发体验&#xff0c;将SD…

FPGA中级项目4——DDS实现

FPGA中级项目4——DDS实现 DDS简介 DDS&#xff08;直接数字频率合成器&#xff0c;Direct Digital Frequency Synthesis&#xff09;是一种基于数字信号处理技术的频率合成方法&#xff0c;广泛应用于通信、雷达、仪器仪表等领域。在 FPGA中实现 DDS 具有灵活性高、集成度强、…

SAP的WPS导出找不到路径怎么办;上载报错怎么办

一.打开注册编辑器 二.输入以下地址 计算机\HKEY_CLASSES_ROOT\ExcelWorksheet\Protocol\StdFileEditing\Server 去除掉EXE后面的命令即可 二&#xff1a;WPS上载文件没反应怎么办 如何切换整合模式或多组件模式-WPS学堂 根据官方操作把整合模式改成多组件模式

STM32 DAC详解:从原理到实战输出正弦波

目录 一、DAC基础原理1.1 DAC的作用与特性1.2 DAC功能框图解析 二、DAC配置步骤2.1 硬件配置2.2 初始化结构体详解 三、DAC数据输出与波形生成3.1 数据格式与电压计算3.2 正弦波生成实战3.2.1 生成正弦波数组3.2.2 配置DMA传输3.2.3 定时器触发配置 四、常见问题与优化建议4.1 …

MVC_Publish-Subscriber 模式中的事件处理程序

MVC_Publish-Subscriber 模式中的事件处理程序 MVC 中的事件处理&#xff1a;发布者-订阅者模式 程序启动时&#xff0c;controlRecipes将被传入addHandlerRender; addHandlerRender会侦听事件&#xff08;addEventListener&#xff09;,并使用controlRecipes作为回调&#xf…

网络华为HCIA+HCIP 以太网链路聚合与交换机堆叠、集群

网络可靠性 网络的可靠性指当设备或者链路出现单点或者多点故障时保证网络服务不间断的能力。网络的可靠性可以从单板、设备、链路多个层面实现。 单板可靠性 以S12700E-8为例&#xff0c;设备提供8个线路板槽位、4个交换网板槽位、2个主控板槽位、6个电源模块槽位、4个风扇…

施耐德PLC仿真软件Modbus tcp通讯测试

安装仿真软件&#xff1a;EcoStruxure™ Control Expert - PLC 仿真器 下载地址&#xff1a;https://www.schneider-electric.cn/zh/download/document/EIO0000001719/ 配置CPU&#xff1a; 切换至仿真模式&#xff0c;系统托盘中出现仿真器图标 新建变量test&#xff0c;地址…

LabVIEW棉花穴播器排种自动监测系统

一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区&#xff0c;种植面积常年超250万公顷&#xff0c;传统人工播种存在两大核心问题&#xff1a; 效率瓶颈&#xff1a;人均日播种面积不足0.5公顷&#xff0c;难以匹配规模化种植需求&#xff1b; 精度缺陷&#xff1a;人…

2024浙江大学计算机考研上机真题

2024浙江大学计算机考研上机真题 2024浙江大学计算机考研复试上机真题 2024浙江大学计算机考研机试真题 2024浙江大学计算机考研复试机试真题 历年浙江大学计算机复试上机真题 历年浙江大学计算机复试机试真题 2024浙江大学计算机复试上机真题 2024浙江大学计算机复试机试真题 …

GPU视频编解码:Jetson VPI+multimedia_api视频编解码入门(一)

目录 一.Pipline与工具栈 二.硬件设备概况 三.GPU视频编解码框架 四.VPI编译使用实例 五. jetson_multimedia_api编译使用实例 一.Pipline与工具栈 二.硬件设备概况 三.GPU视频编解码框架 jetson设备目前不支持VPF框架&#xff0c;关于VPF的使用我在下节PC段使用X86进行安…

设计模式-对象创建

对象创建 前言1. Factory Method1.1 模式介绍1.2 模式代码1.2.1 问题代码1.2.2 重构代码 1.3 模式类图1.4 要点总结 2. Abstract Factory2.1 模式介绍2.2 模式代码2.2.1 问题代码2.2.2 重构代码 2.3 模式类图2.4 要点总结 3. Prototype3.1 模式介绍3.2 模式代码3.3 模式类图3.4…

【大模型基础_毛玉仁】2.6 非 Transformer 架构

更多内容&#xff1a;XiaoJ的知识星球 目录 2.6 非 Transformer 架构2.6.1 状态空间模型 SSM1&#xff09;SSM&#xff08;State Space Model&#xff09;2&#xff09;RWKV&#xff08;Receptance Weighted Key Value&#xff09;3&#xff09;Mamba 2.6.2 训练时更新TTT(Test…

压测实战 | 微信小程序商城 “双 11” 的压测实践

背景 某全球知名珠宝品牌&#xff0c;始终以创新驱动零售变革。随着全渠道战略的深化&#xff0c;其小程序官方商城逐渐成为品牌私域流量的核心阵地&#xff0c;不仅承载了线上销售、会员运营等功能&#xff0c;同时还与其内部系统打通&#xff0c;如会员管理系统、人力资源系…

Webpack vs Rollup vs Parcel:构建工具深度对比

文章目录 1. 核心特性对比1.1 功能定位1.2 技术架构对比 2. 配置与使用2.1 Webpack 配置示例2.2 Rollup 配置示例2.3 Parcel 使用示例 3. 性能对比3.1 构建速度3.2 输出质量 4. 生态系统4.1 插件生态4.2 学习曲线 5. 适用场景分析5.1 Webpack 适用场景5.2 Rollup 适用场景5.3 P…

JUC大揭秘:从ConcurrentHashMap到线程池,玩转Java并发编程!

目录 JUC实现类 ConcurrentHashMap 回顾HashMap ConcurrentHashMap CopyOnWriteArrayList 回顾ArrayList CopyOnWriteArrayList: CopyOnWriteArraySet 辅助类 CountDownLatch 线程池 线程池 线程池优点 ThreadPoolExecutor 构造器各个参数含义&#xff1a; 线程…

【unity实战】用unity封装一个复杂全面且带不同射击模式的飞机大战射击系统

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

【AWS入门】Amazon EC2简介

【AWS入门】Amazon EC2简介 A Brief Introduction to Amazon EC2 By JacksonML 1. 背景 众所周知&#xff0c;互联网时代的用户每天需要访问Web站点&#xff0c;以获取不同的信息和数据。而海量的Web站点&#xff0c;其内容均存放在服务器上&#xff0c;无论服务器有多远&am…

PyTorch系列教程:基于LSTM构建情感分析模型

情感分析是一种强大的自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;用于确定文本背后的情绪基调。它常用于理解客户对产品或服务的意见和反馈。本文将介绍如何使用PyTorch和长短期记忆网络&#xff08;LSTMs&#xff09;创建一个情感分析管道&#xff0c;LSTMs在处…

Vue 渲染 LaTeX 公式 Markdown 库

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…