如何为QEMU新增可仿真的自定义系统、开发板或SOC模型?
QEMU新增ARM Cortex-M33 SOC仿真实现方案
前置准备
- 拉取QEMU最新稳定版源码完成本地编译,确认自带的
qemu-system-arm可以正常运行现有Cortex-M33架构的开发板仿真,验证ARMv8-M架构支持正常 - 收集目标SOC的完整官方技术手册,提取核心参数:完整内存映射表、外设寄存器定义、中断号分配表、时钟配置、启动流程逻辑
实现步骤
1. 复用已有的Cortex-M33核心实现
QEMU内置了标准Cortex-M33的CPU核心模型,无需从零开发核心。直接在hw/arm/目录下新建目标SOC的实现文件,参考同目录下其他M33架构SOC的初始化代码,实例化M33核心对象即可。
2. 注册核心内存与标配外设
- 按照手册定义的Flash、SRAM的基地址与容量,调用内存区域相关接口注册对应内存段
- 实例化M33标配的NVIC中断控制器、SysTick定时器,按照手册的中断映射关系完成绑定
3. 开发自定义外设模型
SOC独有的外设(GPIO、UART、SPI、ADC等)需要单独实现:
- 每个外设对应独立的代码文件,可放在
hw/misc/或者单独新建的SOC专属目录下 - 所有外设继承
DeviceState基类,实现对应寄存器的读写回调逻辑,对外暴露中断输出端口绑定到NVIC对应中断号 - 同类型外设可以直接参考QEMU现有实现做适配修改,降低开发量
4. 完成SOC整体初始化
在SOC的实现文件中编写整体初始化函数,将CPU核心、内存、所有外设按照内存映射表挂载到系统总线,配置正确的启动地址。
5. 修改编译配置
更新hw/arm/Kconfig和hw/arm/meson.build文件,添加新增SOC的编译选项,将新增的代码文件纳入编译链路。
6. 验证调试
- 编译完成后执行
qemu-system-arm -M ?,确认新增的SOC机型已经出现在支持列表中 - 先运行极简裸机测试固件(如UART打印、LED翻转逻辑)验证基础功能正常
- 逐步测试中断响应、外设通信、低功耗模式等复杂功能,对照手册修正模拟逻辑
参考资料
所有开发相关的官方指引都可以在QEMU源码的docs/devel/目录下找到,重点关注设备模型开发规范、ARM架构仿真开发说明、内存API使用手册三部分内容即可。
内容的提问来源于stack exchange,提问作者tchan
相关产品推荐
相关产品推荐

