Operating system VirtualBox上PCI Express(PCIe)配置空间访问问题

Operating system VirtualBox上PCI Express(PCIe)配置空间访问问题,operating-system,virtualbox,pci-e,acpi,Operating System,Virtualbox,Pci E,Acpi,您好,我正在尝试在内核基础上使用MMIO方法访问PCIe配置空间 在我回答问题之前,我的平台是Windows10,VirtualBox 6.0.10 我的虚拟机设置为默认值,但以下情况除外: 芯片组选择ICH9 核心编号设置为4 内存设置为1GB 添加了IDE控制器(未连接HD) 引导后,打印显示有效内存地址为:0x0~0x9FC00和0x100000~0x3FEF0000,如以下屏幕截图所示 类型1为RAM,2为ROM或保留,3为ACPI回收内存,4为ACPI NVS内存 此外,我从MCFG

您好,我正在尝试在内核基础上使用MMIO方法访问PCIe配置空间

在我回答问题之前,我的平台是Windows10,VirtualBox 6.0.10

我的虚拟机设置为默认值,但以下情况除外:

  • 芯片组选择ICH9
  • 核心编号设置为4
  • 内存设置为1GB
  • 添加了IDE控制器(未连接HD)
  • 引导后,打印显示有效内存地址为:0x0~0x9FC00和0x100000~0x3FEF0000,如以下屏幕截图所示

    类型1为RAM,2为ROM或保留,3为ACPI回收内存,4为ACPI NVS内存

    此外,我从MCFG检索到PCIe配置内存映射基址的基址,如以下屏幕截图所示

    可以看出:

  • 配置空间基数为0x3F000000,与有效内存空间重叠
  • 0x3F000000~0x3F000008的前8字节都是0,应该是总线0、设备0、功能0的前8字节
  • 那么,我是不应该使用VirtualBox,还是应该执行一些其他操作来启用配置空间的PCIe MMIO可访问性


    非常感谢

    您可能错误地解析了“MFCG ACPI表”,或者为“MFCG ACPI表”使用了错误的(虚拟?)地址,并且忘记了检查签名和校验和


    “基本地址:”没有意义,“开始PCI_总线:0,结束PCI_总线:0”也没有意义。

    您可能错误地解析了“MFCG ACPI表”,或者为“MFCG ACPI表”使用了错误的(虚拟)地址,忘记了检查签名和校验和


    “基本地址:”没有意义,“启动PCI总线:0,结束PCI总线:0”也没有意义。

    启动总线0后跟相同的结束总线值对于某些平台有意义。为什么不可以?@0andriy:假设您正在设计一个处理PCIE MMIO的电路,该电路将添加到您公司的“电路库”中,以便其他人可以将该电路剪切并粘贴到10个不同的芯片组中,用于200个不同的主板;连接的任何PCI设备(由芯片组设计师、主板制造商、计算机OEM或最终用户)可能包括其自己的“PCI到PCI桥”(产生辅助总线号)。只支持一个总线号的电路将是“利基”电路,因此在经济上不可行。@0andriy:注意,(假设的)“PCIE MMIO处理电路”主要是将CPU/s上的“读/写到物理地址”事务转换为PCI总线上的“读/写PCI配置空间”特殊事务;并从一个典型的地址检测器开始(如
    if((地址和掩码)=BASE)
    ),然后可能只是修改事务头中的“事务类型”字段,并将掩码应用于事务中的地址信息(
    地址和掩码;
    )。对于支持多个总线号的电路来说,它几乎不需要任何成本(没有额外的晶体管)。所以你同意它在某些情况下是有意义的,对吗?(至少我在野外知道这样的平台)@0andriy:“仅用于总线的PCI-E MMIO”可能仅限于ACPI和PCI-E没有意义的情况(例如,没有扩展选项的自定义SoC的内部总线)。启动总线0后跟相同的结束总线值对某些平台有意义。为什么不可以?@0andriy:假设您正在设计一个处理PCIE MMIO的电路,该电路将添加到您公司的“电路库”中,以便其他人可以将该电路剪切并粘贴到10个不同的芯片组中,用于200个不同的主板;连接的任何PCI设备(由芯片组设计师、主板制造商、计算机OEM或最终用户)可能包括其自己的“PCI到PCI桥”(产生辅助总线号)。只支持一个总线号的电路将是“利基”电路,因此在经济上不可行。@0andriy:注意,(假设的)“PCIE MMIO处理电路”主要是将CPU/s上的“读/写到物理地址”事务转换为PCI总线上的“读/写PCI配置空间”特殊事务;并从一个典型的地址检测器开始(如
    if((地址和掩码)=BASE)
    ),然后可能只是修改事务头中的“事务类型”字段,并将掩码应用于事务中的地址信息(
    地址和掩码;
    )。对于支持多个总线号的电路来说,它几乎不需要任何成本(没有额外的晶体管)。所以你同意它在某些情况下是有意义的,对吗?(至少我在野外知道这样的平台)@0andriy:“仅用于总线的PCI-E MMIO”可能仅限于ACPI和PCI-E没有意义的情况(例如,没有扩展选项的自定义SoC的内部总线)。一切似乎都是正确的。您是否尝试在PCI根网桥后面添加任何其他设备?一切似乎都是正确的。您是否尝试在PCI根网桥后面添加任何其他设备?