QEMU pcie config空间访问机制

qemu虚拟化-pci设备模拟 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; 阅读详情

一、PCIE config空间

pci设备的config空间只有256字节,X86架构下是通过两个IO端口访问的,0xCF8/0xCFC端口,分别用于选通地址和传输数据。当前大部分设备都是pcie设备,config空间扩展到了4KB,而对于[256-4096)的扩展config空间,X86是通过memory映射的方式访问,并非IO端口的形式。也就是X86会把pcie的config空间映射到一片memory空间,访问这片空间的时候RC就会发出config tlp报文。

这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。

文章对于qemu的虚机memory管理机制不单独介绍。

二、config空间(前256B)的模拟

这一部分的模拟,首先从hw/pci-host/q35.c查看。q35是一种常用的X86机型,当前qemu里的X86机型都是使用q35来模拟。


qemu-system-x86_64 -machine q35,accel=kvm -cpu host -smp sockets=2,cores=2,threads=1 -m 4096

具体的q35的machine模拟初始化接口,里面代码很多,我们只关注pci host主桥的初始化。在pc_q35_init接口里直接调用qdev_new()接口(非命令行显式创建)实例化一个host主桥,设备类型为TYPE_Q35_HOST_DEVICE,这个设备的驱动定义在hw/pci-host/q35.c里。


/* PC hardware initialisation */
static void pc_q35_init(MachineState *machine)
{
    /* create pci host bus */
    q35_host = Q35_HOST_DEVICE(qdev_new(TYPE_Q35_HOST_DEVICE));
}

在TYPE_Q35_HOST_DEVICE的realize接口中,对0xCF8/0xCFC两个端口进行了注册,注册到conf_mem和data_mem两个MemoryRegion里。


static void q35_host_realize(DeviceState *dev, Error **errp)
{
    sysbus_add_io(sbd, MCH_HOST_BRIDGE_CONFIG_ADDR, &pci->conf_mem);
    sysbus_init_ioports(sbd, MCH_HOST_BRIDGE_CONFIG_ADDR, 4);

    sysbus_add_io(sbd, MCH_HOST_BRIDGE_CONFIG_DATA, &pci->data_mem);
    sysbus_init_ioports(sbd, MCH_HOST_BRIDGE_CONFIG_DATA, 4);
}

在TYPE_Q35_HOST_DEVICE的instance_init接口中,添加了0xCF8/0xCFC端口对应的MemoryRegion的处理函数。


从RCRB到BAR:手把手教你理解PCIe设备的地址空间与配置(附实战配置流程) 本文深入解析PCIe设备的地址空间配置,从RCRB到BAR寄存器的实战指南。通过QEMU仿真环境下的真实案例,详细演示PCIe设备的初始化流程和地址映射过程,对比MMIO与PIO访问方式的性能差异与适用场景,帮助开发者掌握PCIe设备配置的核心技术。 阅读详情

相关推荐

保姆级教程:在QEMU虚拟环境中搭建与调试PCIe DOE功能

本文提供了一份详细的QEMU虚拟环境中搭建与调试PCIe DOE功能的保姆级教程。通过配置QEMU环境、准备内核与工具链、实现DOE功能发现与枚举,以及实战数据交换和高级调试技巧,帮助开发者掌握PCIe 6.0引入的Data Object Exchange(DOE)安全通信机制。

weixin_30300225的博客 479

Qemu在ARM和X86平台上的运行机制初探

User mode:用户模式,在这种模式下,QEMU 运行某个单一的程序,并且适配其的系统调用。通常我们遇到的异构 PWN 题都会使用这种模式,这种模式可以简单轻便的模拟出其他架构程序的执行过程,使做题人的重心倾斜于分析异构的题目文件上,而不是转换过程中。System mode:系统模式,在这种模式下,QEMU 可以模拟出一个完整的计算机系统。包含TCG/TCI两个后端。KVM Hosting 模式,使用KVM作为加速后端。

tugouxp的专栏 2148

从0xCF8到0xCFC:手把手调试QEMU中PCI设备的配置空间读写

本文深入解析QEMU模拟环境中PCI设备配置空间的读写机制,从0xCF8/0xCFC端口操作到设备配置的完整链路。通过GDB调试和QEMU Monitor实战演示,详细讲解PCI配置空间的基础知识、地址解析、数据读写流程及常见问题排查方法,帮助开发者掌握虚拟设备调试的核心技术。

weixin_42532938的博客 366

最小PCIe驱动:Linux内核设备识别与QEMU虚拟环境实战

PCIe驱动是Linux设备驱动开发中的关键范式,其本质是让内核通过PCI子系统‘看见’并管理硬件设备。它基于PCIe协议规范,依赖配置空间访问、BAR资源映射、中断注册与生命周期回调等核心机制。技术价值在于构建软硬协同的可信执行基础,支撑AI加速卡、NVMe SSD、FPGA等高性能外设的稳定接入。典型应用场景包括QEMU虚拟PCIe拓扑搭建、probe失败根因定位(如-ID不匹配、-EBUSY资源冲突)、以及从最小骨架向真实驱动(如nvidia-uvm、amdgpu)演进。本文聚焦PCIe设备识别原理与

weixin_42628688的博客 144

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

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

phmatthaus的专栏 3679

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

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

qq_42138566的博客 1230

QEMU PCIe设备实现

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

STM32 IAP跳转后APP卡死?别慌,手把手教你修复HAL_RCC_OscConfig时钟配置冲突

本文深入分析了STM32 IAP跳转后APP在HAL_RCC_OscConfig函数中卡死的问题,揭示了PLL时钟配置冲突的根本原因。通过详细的代码示例和分步解决方案,指导开发者正确处理STM32F1/F4系列的时钟系统二次初始化问题,确保IAP+APP架构的稳定运行。

weixin_28685287的博客 359

扩增子分析|溯源分析在R中的复现:跟着Nature系列文章利用FEAST溯源分析包追溯微生物群落的起源

溯源分析由Liat Shenhav等人在2019年发表在Nature Methods杂志,他们开创的一种分析微生物群落组成结构的方法,通过量化不同微生物样本(来源)在目标微生物群落(汇)中的比例或分数识别微生物群落的潜在来源。该方法自发表以来受到微生物学界广泛关注,该论文截止2024年10月9日已经被引289次,是领域内高被引论文,该方法已经成为Nature,cell系列文章高度关注的方法。

weixin_46814750的博客 3418

USVInland 数据集实战:4个月采集27段数据,26公里内河SLAM评测

本文详细解析了USVInland数据集在内河SLAM算法评测中的应用实践。通过4个月采集的27段共26公里真实多传感器数据,该数据集有效解决了GPS信号遮挡、动态反射干扰等内河无人船SLAM核心挑战。文章从数据预处理、算法优化到性能评测,全面展示了如何利用毫米波雷达与视觉数据的时空对齐特性提升定位精度,为水上无人驾驶技术提供重要基准。

weixin_33158887的博客 337

20道SpringSecurity常见面试题汇总(超详细回答 !!!)

本文中,我们将探讨一些与 Spring Security 相关的面试问题。Spring Security 是一款流行的 Java 应用程序安全框架,它提供了一套全面且易于使用的安全解决方案。

小斜同学的博客 3064

头歌 DNS协议分析第3关----DNS 报文分析

DNS 报文分析

qq_67667368的博客 4328

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

224

如何从 VMware 官网下载最新版本的 VMware Workstation

如何从 VMware 官网下载 VMware Workstation

XiaoqiangClub的博客 5740

Spring AI Alibaba实战训练营-05模型输出质量评估

本文介绍了使用Spring AI Alibaba库评估AI模型输出质量的方案。项目通过5种评估器实现自动化评估:相关性评估、事实准确性评估、答案相关性评分、答案正确性评估和忠实度评估。开发步骤包括环境准备(Java 17、Maven、API Key获取)、创建Maven项目、配置Spring AI(通过环境变量安全设置API Key)以及实现RAG流程。重点强调了通过评估器自动检测AI输出的质量指标,帮助开发者优化AI应用性能。

program哲学 210

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: IOMMU地址映射
下一篇: ethtool查询virtio网卡异常的问题
light_forest
博客等级 码龄16年 213粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值