qemu(2) -- 定制开发板

1. 前言

qemu支持自定义开发板,本文就记录一下折腾的过程。基于qemu-10.0.0-rc3添加x210vb3s开发板。

2. 添加板卡文件

网上参考了一些文章,有些文章使用的版本和我的不一样,折腾起来费了点时间,最后发现还是直接参考qemu中已有的开发板文件比较快捷,经过一些尝试,最后选择参考hw/arm/xilinx_zynq.c来编写我的开发板文件,并经过一番尝试,移除了一些无关紧要的代码,得到一个能运行的最简版本。

  1. 新增hw/arm/x210vb3s.c
#include "qemu/osdep.h"
#include "hw/boards.h"
#include "hw/arm/boot.h"
#include "hw/loader.h"
#include "qapi/error.h"struct BoardState {/*< private >*/MachineState parent;/*< public >*/ARMCPU *cpu[1];MemoryRegion iram;MemoryRegion dram;
};/* 此处定义的宏的名字是局部的,字符串“x210bv3s”需要全局唯一 */
#define TYPE_BOARD MACHINE_TYPE_NAME("x210bv3s")
OBJECT_DECLARE_SIMPLE_TYPE(BoardState, BOARD)static struct arm_boot_info boot_info = {/* 该值需要比-kernel指定的可执行文件要大,此处0x18000(96KB)是iRAM的大小,运行裸机程序时,-kernel后面应当指定elf文件 */.ram_size = 0x18000,
};static void board_init(MachineState *ms)
{BoardState *s = BOARD(ms);MachineClass *mc = MACHINE_GET_CLASS(ms);MemoryRegion *system_mem = get_system_memory();/* 创建CPU,如果不创建,qemu启动后会提示无CPU */Object *cpuobj = object_new(mc->default_cpu_type);qdev_realize(DEVICE(cpuobj), NULL, &error_fatal);s->cpu[0] = ARM_CPU(cpuobj);/* 创建iRAM,如果不添加内存,则qemu启动后无法访问任何内存,程序也不能正常加载和执行 *//* iRAM: 0xD0020000-0xD0038000:96KB */memory_region_init_ram(&s->iram, NULL, "iram",0xD0038000-0xD0020000, &error_fatal);memory_region_add_subregion(system_mem, 0xD0020000, &s->iram);/* 启动-kernel的加载,不执行该函数qemu可以连接gdb,但是不会执行-kernel指定的文件 */arm_load_kernel(s->cpu[0], ms, &boot_info);
}static void board_class_init(ObjectClass *oc, void *data)
{MachineClass *mc = MACHINE_CLASS(oc);static const char * const valid_cpu_types[] = {ARM_CPU_TYPE_NAME("cortex-a8"),NULL};mc->desc = "X210BV3S S5PV210 (Cortex-A8)";mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a8");mc->valid_cpu_types = valid_cpu_types;mc->init = board_init;/* 定义该值为true,程序访问非法内存时不会产生内存访问异常 */mc->ignore_memory_transaction_failures = false;
}static const TypeInfo board_info = {.name = TYPE_BOARD,.parent = TYPE_MACHINE,.instance_size = sizeof(BoardState),.class_init = board_class_init,
};static void machine_register(void)
{type_register_static(&board_info);
}type_init(machine_register)

3. 修改编译文件

  1. hw/arm/Kconfig,按照已有内容格式添加如下内容,可以添加到文件结尾处,default y表示启动编译,否者不会参与编译。
config X210BV3Sbooldefault y
  1. hw/arm/meson.build,按照已有内容添加如下内容,注意是arm_ss不是system_ss,这个问题也折腾了我好久,它们两个都会被编译,但是编译的参数略有不同,此处的编译条件CONFIG_X210BV3S已经在hw/arm/Kconfig中使能了,所以会被编译。
arm_ss.add(when: 'CONFIG_X210BV3S', if_true: files('x210bv3s.c'))

4. 重新编译

# 启动容器,需要在容器中编译,我之前的容器停止了,此处直接启动即可
$ docker start -i qemu
# 此处进入容器环境
$ cd /qemu/build
# 重新配置工程,只编译qemu-system-arm程序
$ ../configure --target-list=arm-softmmu
# 此时是追加编译很快就结束了
$ make -j24
# 查看新增的开发板,已经存在了
$ ./qemu-system-arm -M help
x210bv3s             X210BV3S S5PV210 (Cortex-A8)

5. 运行

参考qemu(1) – 安装中的ctr0.S,此处仍运行该程序。

# 因为没有将arm-none-eabi工具链挂载到容器中,测试多有不便,所以我们可以在wsl中运行qemu-system-arm程序
$ cd qemu-10.0.0-rc3/build
# 启动qemu,~/workspace/arm/x210bv3s/bare/start/crt0.elf是我之前创建crt0.S测试文件的位置
$ ./qemu-system-arm -M x210bv3s -kernel ~/workspace/arm/x210bv3s/bare/start/crt0.elf -S -s
# 新启动一个窗口,运行arm-none-eabi-gdb,测试一切正常

上一篇:qemu(1) – 安装
下一篇:qemu(2) – 定制开发板
目录:全部文章合集

参考

如何使用 QEMU 模拟一块开发板
基于qemu从0开始构建嵌入式linux系统

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

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

相关文章

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数(决策树、逻辑回归、KNN、SVM)

Python在糖尿病分类问题上寻找具有最佳 ROC AUC 分数和 PR AUC 分数&#xff08;决策树、逻辑回归、KNN、SVM&#xff09; 问题模板解题思路1. 导入必要的库2. 加载数据3. 划分训练集和测试集4. 数据预处理5. 定义算法及其参数6. 存储算法和对应指标7. 训练模型并计算指标8. 找…

CPU(中央处理器)

一、CPU的定义与核心作用 CPU 是计算机的核心部件&#xff0c;负责 解释并执行指令、协调各硬件资源 以及 完成数据处理&#xff0c;其性能直接影响计算机的整体效率。 核心功能&#xff1a; 从内存中读取指令并译码。执行算术逻辑运算。控制数据在寄存器、内存和I/O设备间的…

上层 Makefile 控制下层 Makefile 的方法

在复杂的项目中&#xff0c;通常会将项目划分为多个模块或子项目&#xff0c;每个模块都有自己的 Makefile。上层 Makefile 的作用是协调和控制这些下层 Makefile 的构建过程。下面是几种常见的示例&#xff0c;实现上层 Makefile 对下层 Makefile 的控制。 直接调用&#xff1…

prompts提示词经典模板

prompts.py 中的提示词模板详解 文件中定义了两个核心提示词模板&#xff1a;REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。这两个模板在 DeepResearcher 的推理过程中扮演着关键角色。下面我将详细解析这两个模板的结构和功能。 REASON_PROMPT 详解 REASON_PROMPT 是用于指…

使用python获取电脑硬盘信息

import psutil# 获取硬盘信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"设备: {partition.device}")print(f"挂载点: {partition.mountpoint}")print(f"文件系统类型: {partitio…

HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步

作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一种数据库查询优化技术&#xff0c;通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况&#xff0c;因为它可以在索引扫描阶段就排除不符合全部条件的数据行&#xff0c;而不是将所有可能匹配的记录加载到服务器层再进行…

idea在线离线安装插件教程

概述 对于小白来说&#xff0c;刚使用idea时&#xff0c;还有很多不懂的地方&#xff0c;这里&#xff0c;简单介绍下如何安装插件。让小白能容易上手全盘idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安装 3.1、在线安装 输入想搜索的内容&#x…

豪越赋能消防安全管控,解锁一体化内管“安全密码”

在消防安全保障体系中&#xff0c;内部管理的高效运作是迅速、有效应对火灾及各类灾害事故的重要基础。豪越科技凭借在消防领域的深耕细作与持续创新&#xff0c;深入剖析消防体系内部管理的痛点&#xff0c;以自主研发的消防一体化安全管控平台&#xff0c;为行业发展提供了创…

ES6学习03-字符串扩展(unicode、for...of、字符串模板)和新方法()

一、字符串扩展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.

探索Streamlit在测试领域的高效应用:文档读取与大模型用例生成的完美前奏

大模型用例生成前置工作之文档读取——构建你的自动化测试基础 在群友的极力推荐下&#xff0c;开始了streamlit的学习之旅。本文将介绍如何使用Streamlit开发一个多功能文档处理工具&#xff0c;支持读取、预览、格式转换和导出多种测试相关文档&#xff08;YAML、JSON、DOCX…

flutter 桌面应用之窗口自定义

在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置 我们有两个框架选择:window_manager和bitsdojo_window 对比bitsdojo_window 特性bitsdojo_windowwindow_manager自定义标题栏✅ 支持❌ 不支持控制窗口行为&#xff08;大小/位置&#xff09;✅&#xff08;基本…

Cyber Weekly #51

赛博新闻 1、英伟达开源新模型&#xff0c;性能直逼DeepSeek-R1 本周&#xff0c;英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型&#xff0c;该模型拥有2530亿参数&#xff0c;在多项基准测试中展现出与6710亿参数的…

【JS】关于原型/原型链

本文会讲解什么是原型&#xff0c;什么是原型链&#xff0c;以及查找原型的方法&#xff0c;最后会实现一个函数&#xff1a;判断某对象是否有某属性。 定义 原型&#xff1a;函数都有prototype属性&#xff0c;称作原型/原型对象 原型可以放一些方法和属性&#xff0c;共享…

deskflow使用教程:一个可以让两台电脑鼠标键盘截图剪贴板共同使用的开源项目

首先去开源网站下载&#xff1a;Release v1.21.2 deskflow/deskflow 两台电脑都要下载这个文件 下载好后直接打开找到你想要的exe desflow.exe 然后你打开他&#xff0c;将两台电脑的TLS都关掉 下面步骤两台电脑都要完成&#xff1a; 电脑点开edit-》preferences 把这个取…

啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!

一、啥是Spring&#xff0c;为啥选择它 我们平常说的Spring指的是Spring全家桶&#xff0c;我们为什么要选择Spring&#xff0c;看看官方的话&#xff1a; 意思就是&#xff1a;用这个东西&#xff0c;又快又好又安全&#xff0c;反正就是好处全占了&#xff0c;所以我们选择它…

正向代理 vs 反向代理:核心区别与应用场景详解

目录 代理服务器是什么&#xff1f; 正向代理&#xff08;Forward Proxy&#xff09;详解 工作原理 典型应用场景 优缺点分析 反向代理&#xff08;Reverse Proxy&#xff09;详解 工作原理 典型应用场景 优缺点分析 正向代理与反向代理的核心区别 对比表格 架构差异…

Matlab学习笔记五十:循环语句和条件语句的用法

1.说明 循环语句&#xff1a;for…end&#xff0c;while…end 条件语句&#xff1a;if…end&#xff0c;switch…case…end 其中if语句语法还可以是&#xff1a;for…else…end&#xff0c;for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…

容器初始化Spring Boot项目原理,即web项目(war)包涉及相关类对比详解

以下是关于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的对比详解及总结表格&#xff1a; 1. 核心对比详解 (1) SpringBootServletInitializer 作用&#xff1a; S…

Linux 系统中打包与压缩

以下是 Linux 系统中 打包与压缩 的核心操作指南&#xff0c;涵盖常用命令、格式对比及典型场景应用&#xff1a; 一、核心概念 打包&#xff08;Archiving&#xff09; 将多个文件或目录合并为一个文件&#xff08;如 .tar&#xff09;&#xff0c;不改变文件体积。常用工具&a…