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

通过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

相关文章:

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

通过qemu仿真树莓派系统调试IoT固件和程序 本文将介绍如何使用 QEMU 模拟器在 x86 架构的主机上运行 Raspberry Pi OS&#xff08;树莓派操作系统&#xff09;。我们将从下载镜像、提取内核和设备树文件&#xff0c;到启动模拟环境&#xff0c;并进行一些常见的操作&#xff0…...

Oracle底层原理解析

Oracle 解析 1、union \ union all \ Intersect \ Minus内部处理机制&#xff08;优化&#xff09; 当查询语句中的where子句中使用到or时&#xff0c;可以用union all来代替。因为使用or查询语句的时候&#xff0c;引起全表扫描&#xff0c;并走索引查询 特别&#xff1a;当…...

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek&#xff1a;部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型&#xff0c;其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面&#xff0c;对Deep…...

【前端三剑客】万字总结JavaScript

一、初识JavaScript 1.1 JavaScript 的作用 表单动态校验&#xff08;密码强度检测&#xff09; &#xff08; JS 产生最初的目的 &#xff09;网页特效服务端开发(Node.js)桌面程序(Electron)App(Cordova)控制硬件-物联网(Ruff)游戏开发(cocos2d-js) 1.2 HTML/CSS/JS 的关系…...

【哈希表与字符串的算法之路:思路与实现】—— LeetCode

文章目录 两数之和面试题01.02.判定是否为字符重排存在重复元素存在重复元素||字母异位词分组最长公共前缀和最长回文子串二进制求和字符串相乘 两数之和 这题的思路很简单&#xff0c;在读完题目之后&#xff0c;便可以想到暴力枚举&#xff0c;直接遍历整个数组两遍即可&…...

基于Android的记事本APP设计与实现:从需求分析到功能实现(超级简单记事本,附源码+文档报告)

基于Android的记事本APP设计与实现&#xff1a;从需求分析到功能实现 &#xff08;以前大学课堂作业&#xff0c;抄在这里当个回忆吧&#xff09; 引言 随着社会的不断进步&#xff0c;信息化建设不断发展&#xff0c;电子文字输入在生活、学习、工作中占有越来越重要的作用…...

eNSP中路由器的CON/AUX接口、GE Combo接口、Mini USB接口、USB接口、WAN侧uplink接口、FE接口、GE接口介绍

路由器常见接口的详细介绍及其应用示例&#xff1a; 1. CON/AUX 接口 全称&#xff1a;Console/Auxiliary&#xff08;控制台/辅助接口&#xff09;作用&#xff1a; CON&#xff08;Console&#xff09;&#xff1a;通过命令行界面&#xff08;CLI&#xff09;直接配置路由器…...

Hello Mr. My Yesterday日文歌词附假名注音,祭奠逝去的青春

hello mr. my yesterday Hundred Percent Free Hello Mr. my yesterday云っておくれよ “夢叶うその瞬間にまた逢える”と 前方の幾多前途多難の未知 後方の道後悔も知った 経験と価値 夢なかば 一本の道結果だが ひとつだけ知りたいよ 神様がいるのなら “幸せの定義っ…...

ubuntu ollama+dify实践

安装ollama 官网的指令太慢了&#xff0c;使用以下指令加速&#xff1a; export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download" curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/dow…...

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例 前期概要: S7-1200 G2必须基于TIA博途V20,之前的程序可通过移植的方式在新硬件上使用。 该移植工具可自动将TIA Portal 项目从 S7-1200 移植到更新的S7-1200 G2。 注意: 该插件支持在同一TIA Portal项目实例内将软件和/或硬…...

新办公室哪款空气净化器除甲醛效果好?高效除甲醛,提升效率

现代办公环境中&#xff0c;空气质量对员工的健康与工作效率产生着不可忽视的影响。尤其是新装修的办公室&#xff0c;往往因为空气中的甲醛浓度超标而导致一系列健康问题。因此&#xff0c;选择一款性能优越的除甲醛空气净化器就显得尤为重要。合适的空气净化器不仅可以有效过…...

塑造企业数字化形象:企业信息化UI界面设计的关键要素

引言 在数字化转型的大潮中&#xff0c;企业信息化系统的UI&#xff08;用户界面&#xff09;界面设计不仅是技术实现的最后一环&#xff0c;更是塑造企业数字化形象、提升用户体验、增强业务效率的重要手段。优秀的UI设计能够直观展现企业价值观&#xff0c;提升用户粘性&…...

大视频背景暗黑风格的wordpress企业主题免费下载

整体风格是黑色的&#xff0c;首页首屏大视频背景&#xff0c;动态效果非常好。向下滚动时&#xff0c;滚动的特效也不错。 原文 https://www.bixugao.com/wp/26.html...

CUDA编程之内存零拷贝技术

一、实现原理 零拷贝内存通过将‌主机锁页内存‌直接映射到设备地址空间&#xff0c;实现CPU与GPU共享内存&#xff0c;避免显式数据拷贝‌。锁页内存通过cudaHostAlloc或cudaHostRegister分配&#xff0c;确保物理地址固定且不被操作系统换页&#xff0c;从而支持DMA&#xff…...

C语言基础知识04

指针 指针概念 指针保存地址&#xff0c;地址是字节的编号 指针类型和保存的地址类型要一直 使用时注意&#xff0c;把地址转换为&变量的格式来看 int a[3]; a转为&a[0] 指针的大小 64bit 固定8字节&#xff0c; 32bit 固定4字节 指针…...

在 Java 中,== 和 equals 的区别

1. 运算符 作用&#xff1a;比较两个对象的 内存地址&#xff08;引用类型&#xff09;或 值&#xff08;基本数据类型&#xff09;。 适用场景&#xff1a; 基本数据类型&#xff08;int, char, boolean 等&#xff09;&#xff1a;直接比较值是否相等。 引用类型&#xff…...

Qt开发:QtWebEngine中操作选择文本

查找选择 在QtWebEngine中&#xff0c;可以使用QWebEnginePage的findText方法来查找文本&#xff0c;查找成功以后&#xff0c;将自动选择当前文本。 QWebEnginePage可以通过QWebEngineView的page()来取得。 比如&#xff0c;如下代码可以在页面中查找hello,world并选择。 …...

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…...

分布式系统日志排查综合场景

排查背景 在一个大型分布式电商系统中&#xff0c;用户反馈在进行商品结算时出现了报错。系统由多个子系统构成&#xff0c;包括商品管理系统、订单系统、支付系统等&#xff0c;各子系统分布在不同服务器上&#xff0c;且日志文件分散存储。 排查过程 确定当前位置并切换到可…...

android lmkd.rc 介绍

service service lmkd /system/bin/lmkdclass coreuser lmkdgroup lmkd system readproccapabilities DAC_OVERRIDE KILL IPC_LOCK SYS_NICE SYS_RESOURCEcriticalsocket lmkd seqpacketpasscred 0660 system systemtask_profiles ServiceCapacityLow属于核心服务组&#xff0…...

Android Studio执行Run操作报Couldn‘t terminate previous instance of app错误

步骤1、在项目根目录下build.gradle文件最后添加如下内容 //自定义任务名&#xff1a;assembleAndInstall tasks.register(assembleAndInstall, Exec.class, new Action<Exec>() {Overridevoid execute(Exec exec) {//设置自定义任务组名exec.setGroup(custom task)//当…...

Matlab 双线性插值(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 双线性插值是一种 二维插值方法,用于计算 栅格(Grid) 或 像素点 之间的插值值。它主要用于 图像缩放、旋转、变换 等操作,以在新像素位置估算灰度值或颜色值。 如上图所示,假设存在一个二维离散函数(如图像)…...

1700. 无法吃午餐的学生数量

无法吃午餐的学生数量 题目描述尝试做法推荐做法 题目描述 学校的自助午餐提供圆形和方形的三明治&#xff0c;分别用数字 0 和 1 表示。所有学生站在一个队列里&#xff0c;每个学生要么喜欢圆形的要么喜欢方形的。 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个…...

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…...

杨辉三角形(信息学奥赛一本通-2043)

【题目描述】 例5.11 打印杨辉三角形的前n(2≤n≤20)行。杨辉三角形如下图&#xff1a; 当n5时 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输出&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 【输入】 输入行数n。 【输出】 输出如题述三角形。n行&#…...

使用easyexcel实现单元格样式设置和下拉框设置

1.单元格样式设置 1.1实体类 public class DemoData {ExcelProperty("PK")private String name;ExcelProperty("年龄")private int age;// 必须提供无参构造方法public DemoData() {}public DemoData(String name, int age) {this.name name;this.age …...

TCP 三次握手四次挥手过程详解

注&#xff1a;本文为 “TCP 的三次握手与四次挥手” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;未整理去重。 英文引文第二篇&#xff0c;实为国内《稀土掘金技术社区》文章&#xff0c;没检索到原文&#xff0c;此处 “出口转内销” 。 如有内…...

射频相关概念

射频&#xff08;Radio Frequency, RF) 是电磁波谱中频率范围在 3 kHz 到 300GHz的电磁波&#xff0c;广泛应用于通信、雷达、广播、医疗等领域。其基本原理涉及电磁波的产生、传播、调制与解调&#xff0c;以及射频系统的设计。以下是射频技术的核心要点&#xff1a; 1. 电磁…...

几款可用于绘制工艺原理图的开源框架

一、LogicFlow 由滴滴团队开发的开源流程图框架&#xff0c;支持高度定制的工艺原理图绘制。 • 核心特性&#xff1a; • 提供拖拽式界面和丰富的节点类型&#xff08;矩形、圆形、多边形等&#xff09;&#xff0c;支持自定义节点形状、样式和交互逻辑。 • 支持插件扩展&am…...

27.卷2的答案

CSP-J离我们不远了&#xff0c;加加油啦&#xff01; 1.堆排序最坏时间复杂度是&#xff1f; 解析&#xff1a;平时多多练习可知&#xff0c;最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位&#xff0c;并将第二位四舍五入&#xff1f; 解析&#xff1a;经过试…...