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

玩转QEMU硬件模拟器 - Versatilepb模拟器开发概述

Versatilepb模拟器源码

  前段时间作者基于qemu-8.2.5成功开发了基于Cortex-M0plus内核的传感器硬件模拟器,并成功基于该硬件模拟器实现了全功能固件的开发与调试,目前项目已经量产。从而通过具体的项目验证了qemu模拟器在项目开发中的巨大好处和优势。这篇博文,我们继续一起讨论一下Versatilepb模拟器是如何开发出来的。首先,读者在路径: qemu-8.2.5/hw/arm/versatilepb.c可以打开该SoC的顶层源码。作者个人觉得写的稍微有些“多,乱”,为什么呢?因为在versatilepb.c文件中除实现了SIC, PIC等外设外,同时,还实现了versatileab,versatilepb两种基于ARM内核SoC开发板的定义,作者还是倾向于分开实现,并且是*.c/.h*模块化实现。当然了,如果读者已经很熟悉qemu的模拟范式和提供的api接口函数使用那就无所谓了。
versatilepb-SoC
  熟悉了qemu的模拟范式和提供的api接口函数使用以后,那versatilepb模拟器是如何添加外设的呢?这就要先从Arm官网下载用户手册了Versatile Application Baseboard for ARM926EJ-S User Guide,在4.1 Memory map部分,读者可以看到各个外设的地址空间是如何分配的。事实上,QEMU也是按照这里的User Guide来开发Versatilepb模拟器的。
memory map

Versatilepb外设实现

  versatilepb.c中的static void versatile_init(*MachineState machine, int board_id)是核心外设实现函数。涉及到外设的创建、初始化、总线系统地址空间映射、连接中断信号、外设属性设置、连接到系统总线等系列操作。QEMU模拟器实现的逻辑比较清晰,遵从自底向上原则,先实现外设模拟,再将模拟的外设连接到总线上,从而构成一个具有特定SoC功能的用C语言实现的硬件模拟器。这点我们可以软件的角度从versatilepb.c的头文件内容清晰的看到这种实现方式。

#include "qemu/osdep.h"
#include "qapi/error.h"
#include "cpu.h"
#include "hw/sysbus.h"
#include "migration/vmstate.h"
#include "hw/arm/boot.h"
#include "hw/net/smc91c111.h"
#include "net/net.h"
#include "sysemu/sysemu.h"
#include "hw/pci/pci.h"
#include "hw/i2c/i2c.h"
#include "hw/i2c/arm_sbcon_i2c.h"
#include "hw/irq.h"
#include "hw/boards.h"
#include "hw/block/flash.h"
#include "qemu/error-report.h"
#include "hw/char/pl011.h"
#include "hw/sd/sd.h"
#include "qom/object.h"
#include "audio/audio.h"

  从软件编程的角度看,versatilepb.c将实现net, pci, i2c, irq, flash, char, audio等外设设备功能的模块头文件都包含了进来,而这些外设的实现同样遵从范式创建。各外设的具体实现代码读者可以跳转到qemu-8.2.5/hw/去查看,这里,我们以versatilepb.c中的Secondary Interrupt Controller(SIC) 外设实现为例简要介绍:

#define TYPE_VERSATILE_PB_SIC "versatilepb_sic"
OBJECT_DECLARE_SIMPLE_TYPE(vpb_sic_state, VERSATILE_PB_SIC)struct vpb_sic_state {SysBusDevice parent_obj;MemoryRegion iomem;uint32_t level;uint32_t mask;uint32_t pic_enable;qemu_irq parent[32];int irq;
};static const VMStateDescription vmstate_vpb_sic = {.name = "versatilepb_sic"
http://www.lryc.cn/news/621088.html

相关文章:

  • MySql——聚簇索引(主键索引)和非聚簇索索引(非主键索引)引区别(即聚集索引和非聚集索引区别)
  • IPv6互联网地址解析
  • [论文阅读] 人工智能 + 软件工程 | 代码变更转自然语言生成中的幻觉问题研究解析
  • 便宜云服务器持续更新
  • 代币经济模型设计指南:如何通过代币化赋能实体业务与DAO治理?
  • C++ STL学习 之 泛型编程
  • Spring Boot + Redis Sentinel (一主两从)测试案例
  • 面试题之项目中git如何进行管理
  • CVE-2014-6271(bash破壳漏洞 )
  • C语言预处理过程详细介绍
  • 集成电路学习:什么是Machine Learning机器学习
  • STM32F103 basic定时器的介绍和应用
  • Android UI(一)登录注册 - Compose
  • 有哪些开源卫星姿控软件
  • 具身智能Scaling Law缺失:机器人界的“摩尔定律“何时诞生?
  • 用SQL实现对DuckDB rusty_sheet插件批量测试
  • 树莓派 4B 上部署 Minecraft PaperMC 1.20.x 的一键部署脚本
  • Qwen2-VL-2B 轻量化部署实战:数据集构建、LoRA微调、GPTQ量化与vLLM加速
  • Java Stream API:让业务数据处理更优雅
  • HTTP协议深度解析
  • 多种适用于 MCU 固件的 OTA 升级方案
  • STM32学习笔记11-通信协议-串口基本发送与接收
  • Autoppt-AI驱动的演示文稿生成工具
  • pygame的帧处理中,涉及键盘的有`pg.event.get()`与`pg.key.get_pressed()` ,二者有什么区别与联系?
  • ModuleNotFoundError: No module named ‘vllm._C‘
  • 界面设计风格解析 | ABB 3D社交媒体视觉效果设计
  • 3ds MAX文件/贴图名称乱码?6大根源及解决方案
  • tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
  • Java 技术栈中间件优雅停机方案设计与实现全景图
  • FreeSWITCH 对接阿里云流式 TTS:让大模型通话秒级响应