qemu虚拟化-pci设备模拟

QEMU pcie config空间访问机制 而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。 阅读详情

pci设备算是学习qemu必须要掌握的一类设备的模拟,单独提出来说一下。这里以qemu的pci教学程序为基础讲解,源码路径:hw/misc/edu.c

1.设备的定义
typedef struct {
   
   
    PCIDevice pdev;
    MemoryRegion mmio;

    QemuThread thread;
    QemuMutex thr_mutex;
    QemuCond thr_cond;
    bool stopping;

    uint32_t addr4;
    uint32_t fact;
#define EDU_STATUS_COMPUTING    0x01
#define EDU_STATUS_IRQFACT      0x80
    uint32_t status;

    uint32_t irq_status;

#define EDU_DMA_RUN             0x1
#define EDU_DMA_DIR(cmd)        (((cmd) & 0x2) >> 1)
# define EDU_DMA_FROM_PCI       0
# define EDU_DMA_TO_PCI         1
#define EDU_DMA_IRQ             0x4
    struct dma_state {
   
   
        dma_addr_t src;
        dma_addr_t dst;
        dma_addr_t cnt;
        dma_addr_t cmd;
    } dma;
    QEMUTimer dma_timer;
    char dma_buf[DMA_SIZE];
    uint64_t dma_mask;
} EduState;

这个设备有一个dma,继承自PCIDevice,初始化过后是PCIDeviceClass类型,来看一下PCIDeviceClass

typedef struct PCIDeviceClass {
   
   
    DeviceClass parent_class;

    void (*realize)(PCIDevice *dev, Error **errp);
    PCIUnregisterFunc *exit;
    PCIConfigReadFunc *config_read;
    PCIConfigWriteFunc *config_write;

    uint16_t vendor_id;
    uint16_t device_id;
    uint8_t revision;
    uint16_t class_id;
    uint16_t subsystem_vendor_id;       /* only for header type = 0 */
    uint16_t subsystem_id;              /* only for header type = 0 */

    /*
     * pci-to-pci bridge or normal device.
     * This doesn't mean pci host switch.
     * When card bus bridge is supported, this would be enhanced.
     */
    int is_bridge;

    /* rom bar */
    const char *romfile;
} PCIDeviceClass;

主要关注config_read、config_write、vendor_id、device_id、revision、class_id
config_read、config_write两个函数不需要我们自己去实现,pci框架里面已经实现好了。框架会模拟好config的读写。

2.类的初始化


static void edu_class_init(ObjectClass *class, void *data)
{
   
   
    PCIDeviceClass *k = PCI_DEVICE_CLASS(class);

    k->realize = pci_edu_realize;
    k->exit = pci_edu_uninit;
    k->vendor_id = PCI_VENDOR_ID_QEMU;
    k->device_id = 0x11e8;
    k->revision = 0x10;
    k->class_id = PCI_CLASS_OTHERS;
}

static void pci_edu_register_types(void)
{
   
   
    static InterfaceInfo interfaces[] = {
   
   
        {
   
    INTERFACE_CONVENTIONAL_PCI_DEVICE },
        {
   
    },
    };
    static const TypeInfo edu_info = {
   
   
        .name          = TYPE_PCI_EDU_DEVICE,
        .parent        = TYPE_PCI_DEVICE,
        .instance_size = sizeof(EduState),
        .instance_init = edu_instance_init,
        .class_init    = edu_class_init,
        .interfaces = interfaces,
    };

    type_register_static(&edu_info
保姆级教程:在QEMU 7.2.8上从零实现一个PCIe看门狗设备(附完整源码) 本文提供在QEMU 7.2.8上实现PCIe看门狗设备的完整教程,涵盖从源码编译到设备注册的全流程。通过详细的代码示例和调试技巧,帮助开发者掌握QEMU设备开发核心技术,特别适合嵌入式开发者学习自定义设备开发。 阅读详情

相关推荐

mdev虚拟化PCI串口设备试验

本篇参考实践Linux 内核文档 :Documentation/driver-api/vfio-mediated-device.rstDocumentation/driver-api/vfio.rstThis step creates a dummy device, /sys/devices/virtual/mtty/mtty/.打开内核CONFIG_SAMPLE_VFIO_MDEV_MTTY配置项,重新编译内核生成mtty.ko. 重启系统,加载mtty.ko, Files in this devic

tugouxp的专栏 648

HICP云计算---计算虚拟化

一.什么是虚拟化 虚拟化是一个抽象层,它打破了物理硬件和操作系统之间的硬性连接。 虚拟基础结构是一种企业级解决方案,可提供流畅、强大的计算能力,从而最大限度地利用资源和节约成本。 虚拟机是虚拟基础结构的重要元素。虚拟化可以让您在同一台物理机上独立、并行运行安装不同操作系统和应用程序的多台虚拟机。 使用虚拟化,您可以根据需要动态移动资源和处理能力。 虚拟化前:1.IT资源独立;2.操作系统必须与硬件紧耦合。 虚拟化后:1.资源抽像成共享资源池;2.上层操作系统与硬件解耦,操作系统从资源池中分配资源。

weixin_50269770的博客 1484

QEMU源码全解析 —— PCI设备模拟(1)

QEMU源码全解析 —— PCI设备模拟(1)

phmatthaus的专栏 3680

在QEMU中实现一个PCIe仿真设备

以qemu自带的edu设备为基础,实现一个直通PCIe设备。

qq_42138566的博客 1230

QEMU PCIe设备实现

PCIe 设备虚拟化QEMU中的实现 包括处理中断的硬件以及Linux如何响应和处理终端。技术分析分享

为什么你的ESXI无法识别移动硬盘?一步步教你解决USB存储挂载问题

本文深入解析了ESXi无法识别移动硬盘的根本原因,并提供了从诊断到解决的完整方案。核心在于理解ESXi的USB Arbitrator服务机制,通过检查服务状态、内核设备识别及分区表,逐步定位问题。文章详细指导了如何禁用USB仲裁服务以在主机挂载USB存储,或将其直通给虚拟机,并针对大容量硬盘、USB 3.0兼容性等进阶问题给出了实用建议。

qq_27496129的博客 318

skywalking各项指标说明

skywalking各项指标说明

没有简介 2483

C++11并发与多线程笔记(2) 线程启动、结束,创建线程多法、join,detach

第二节 线程启动、结束,创建线程多法、join,detach 一、范例演示线程运行的开始 程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;当主线程从main()函数返回,则整个进程执行完毕 主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,线程也结束运行 整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止【此条有例外,以后会解释】 创建

qq_38231713的博客 1万+

麒麟V10服务器多硬盘安装与分区实战:告别自动分区,手动分配/boot、swap和/根目录

本文详细介绍了麒麟V10服务器在多硬盘环境下的手动分区策略,包括/boot、swap和/根目录的优化分配方案。通过SSD与HDD混合存储架构的合理规划,提升系统性能和运维效率,适用于企业级定制化系统部署需求。

weixin_26976635的博客 403

ANSYS 2026 R1 Windows系统安装避坑指南:环境配置、模块部署与许可证实战

ANSYS作为主流CAE仿真平台,其安装部署已远超传统软件范畴,演变为涉及操作系统底层、GPU驱动兼容性、许可证微服务架构和统一缓存机制的系统工程。理解ANSYS安装原理,需从Windows 11 UEFI安全启动要求、DirectX 12 Ultimate图形栈依赖、gRPC架构的License Manager端口动态分配等核心机制切入;技术价值在于保障HFSS GPU加速、Fluent MPI并行稳定性及Workbench多模块协同可靠性;典型应用场景涵盖高校仿真实验室升级、工业设计院所平台重建及高性能

weixin_29251337的博客 1337

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 221

Dify 第 19 篇 手把手教你开发 Dify 插件:从零实现一个时间工具

本文介绍了Dify平台的插件开发机制和流程。Dify支持多种插件类型,包括模型、工具、数据源等,可通过CLI工具快速开发插件。文章详细讲解了如何安装Dify CLI工具,并演示了从零开发一个获取系统时间插件的完整过程,包括项目初始化、文件解读和打包部署。通过该教程,开发者可以快速掌握Dify插件开发的核心要点,实现自定义功能扩展。

甘蓝的专栏 2428

利用dpabi和restplus提取ROI灰质体积学习笔记

目录前言一、数据准备二、利用dpabi提取ROI灰质体积三、restplus提取ROI灰质体积 前言 我利用SPM/CAT12进行灰质、白质、脑脊液分割之后分别已经得到各自的图像文件,在全脑水平已经做了统计分析。如果还想要进一步进行ROI的统计分析或者与量表等临床资料做相关分析,就需要提取ROI灰质体积。几个月没动过这数据了,突然心血来潮想学一下如何提取ROI灰质体积,以此篇博客记录我的提取ROI灰质体积学习过程。提取ROI灰质体积的方法及软件有许多种,本人尝试了dpabi和restplus。 一、数据准备

weixin_52073820的博客 9218

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: qemu虚拟化-设备模拟框架源码解析(sysbus模拟)
下一篇: qemu虚拟化-pci框架
bai-xin
博客等级 码龄12年 239粉丝 78原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值