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

88 篇文章 19 订阅
本文详细探讨了QEMU中PCI设备的模拟,介绍了PCI设备的基本概念,包括PCI总线的作用、PCI设备的位置确定以及配置空间的结构。通过分析lspci命令的使用,进一步阐述了PCI设备中断号、配置空间内容查看等操作,揭示了PCI设备在系统中的工作原理。
摘要由CSDN通过智能技术生成

接前一篇文章:

1. PCI设备简介

PCI是用来连接外设的一种局部(local)总线,其主要功能是连接外部设备。 PCI总线 规范在20世纪90年代提出以后,逐渐取代了其它各种总线,被各种处理器所支持。直到现在,PCI总线及其发展出来的PCIe总线都在PC上得到广泛使用。在 Linux 系统上,输入lspci命令,可以看到当前系统的PCI设备(笔者使用的是Ubuntu 22.04的虚拟机):

  1. $ lspci
  2. 00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01)
  3. 00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01)
  4. 00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08)
  5. 00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
  6. 00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
  7. 00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10)
  8. 00:0f.0 VGA compatible controller: VMware SVGA II Adapter
  9. 00:10.0 SCSI storage controller: Broadcom / LSI 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
  10. 00:11.0 PCI bridge: VMware PCI bridge (rev 02)
  11. 00:15.0 PCI bridge: VMware PCI Express Root Port (rev 01)
  12. 00:15.1 PCI bridge: VMware PCI Express Root Port (rev 01)
  13. 00:15.2 PCI bridge: VMware PCI Express Root Port (rev 01)
  14. 00:15.3 PCI bridge: VMware PCI Express Root Port (rev 01)
  15. 00:15.4 PCI bridge: VMware PCI Express Root Port (rev 01)
  16. 00:15.5 PCI bridge: VMware PCI Express Root Port (rev 01)
  17. 00:15.6 PCI bridge: VMware PCI Express Root Port (rev 01)
  18. 00:15.7 PCI bridge: VMware PCI Express Root Port (rev 01)
  19. 00:16.0 PCI bridge: VMware PCI Express Root Port (rev 01)
  20. 00:16.1 PCI bridge: VMware PCI Express Root Port (rev 01)
  21. 00:16.2 PCI bridge: VMware PCI Express Root Port (rev 01)
  22. 00:16.3 PCI bridge: VMware PCI Express Root Port (rev 01)
  23. 00:16.4 PCI bridge: VMware PCI Express Root Port (rev 01)
  24. 00:16.5 PCI bridge: VMware PCI Express Root Port (rev 01)
  25. 00:16.6 PCI bridge: VMware PCI Express Root Port (rev 01)
  26. 00:16.7 PCI bridge: VMware PCI Express Root Port (rev 01)
  27. 00:17.0 PCI bridge: VMware PCI Express Root Port (rev 01)
  28. 00:17.1 PCI bridge: VMware PCI Express Root Port (rev 01)
  29. 00:17.2 PCI bridge: VMware PCI Express Root Port (rev 01)
  30. 00:17.3 PCI bridge: VMware PCI Express Root Port (rev 01)
  31. 00:17.4 PCI bridge: VMware PCI Express Root Port (rev 01)
  32. 00:17.5 PCI bridge: VMware PCI Express Root Port (rev 01)
  33. 00:17.6 PCI bridge: VMware PCI Express Root Port (rev 01)
  34. 00:17.7 PCI bridge: VMware PCI Express Root Port (rev 01)
  35. 00:18.0 PCI bridge: VMware PCI Express Root Port (rev 01)
  36. 00:18.1 PCI bridge: VMware PCI Express Root Port (rev 01)
  37. 00:18.2 PCI bridge: VMware PCI Express Root Port (rev 01)
  38. 00:18.3 PCI bridge: VMware PCI Express Root Port (rev 01)
  39. 00:18.4 PCI bridge: VMware PCI Express Root Port (rev 01)
  40. 00:18.5 PCI bridge: VMware PCI Express Root Port (rev 01)
  41. 00:18.6 PCI bridge: VMware PCI Express Root Port (rev 01)
  42. 00:18.7 PCI bridge: VMware PCI Express Root Port (rev 01)
  43. 02:00.0 USB controller: VMware USB1.1 UHCI Controller
  44. 02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
  45. 02:02.0 Multimedia audio controller: Ensoniq ES1371/ES1373 / Creative Labs CT2518 (rev 02)
  46. 02:03.0 USB controller: VMware USB2 EHCI Controller
  47. 02:04.0 SATA controller: VMware SATA AHCI controller

这里对于lspci命令进行一下知识补强。参考一下博文:

lspci 命令详解及常用命令-CSDN博客

一、说明

lspci是查看设备上PCIe设备信息的命令。该命令的不同参数配合,在查看PCIe设备和定位PCIe问题时很有用。包括查看PCIe设备中断号、查看配置空间内容、修改配置空间寄存器等操作。

二、参数说明

表1 基本参数

tag 说明 实例
-v 显示设备上所有pcie设备的一些信息 lspci -v
-vv 显示更多的信息,几乎包含了所有有用的信息 lspci -vv
-vvv 显示相当详细的信息,所有能够解析出来的pcie信息都会显示出来 lspci -vvv
-n 显示设备上所有pcie设备的vendor id 和device id lspci -n
-x 显示设备上所有pcie设备的配置空间的标准部分(前 64 字节或 CardBus 桥接器的 128 字节) lspci -x
-xxx 显示设备上pcie设备的配置空间的所有内容 lspci -xxx
-xxxx 显示 PCI-X 2.0 和 PCI Express 总线上可用的扩展(4096 字节)PCI 配置空间内容 lspci -xxxx
-b 显示所有pcie设备的总线地址 lspci -b
-t 以树形结构显示pcie设备,能展示设备上所以pcie总线、桥、pcie设备之间的连接关系 lspci -t

表二 限制参数

tag 说明 实例
-s [[[[domain]:]bus]:][slot][.[func]] 根据domain bus号等信息,查看指定pcie设备的信息,可搭配表1任意参数使用 lspci -vv -s 00:1f.3
-d []:[] 查看指定device id和vendor id的pcie设备的信息,可搭配表1任意参数使用 lspci -vv -d 8086:8c22

每一个PCI设备在系统中的位置由总线号(Bus Number)、设备号(Device Number)和功能号(Function Number)唯一确定 。有的设备肯能有多个功能,从逻辑上来说是单独的设备。可以在PCI总线上挂一个桥设备,之后在该桥上再挂一个PCI总线或者其它总线。PCI设备结构如下图所示:

2458e0a2549b82165e15180f7a6419ca.png

102876a98ba6a5d4bb54f74bfdee701f.png

PCI设备有自己独立的地址空间,叫做PCI地址空间 。也就是说 从设备角度看到的地址跟从CPU角度看到的地址,本质上不在一个地址空间 ,这种 隔离 是由 上图中的 HOST-PCI(HOST/PCI)主桥完成的 CPU需要通过主桥才能访问PCI设备,而PCI设备也需要通过主桥才能访问主存储器

主桥的一个重要作用就是将处理器访问的存储器地址转换为PCI总线地址 。x86架构对于存储器地址空间和PCI地址空间区分得不是很清晰,因为本质上是两个不同的地址空间,但是其地址是相同且一一对应的。

每个PCI设备都有一个配置空间,该空间至少有256字节。其中,前面64个字节是标准化的,每个设备都是这个格式,后面的数据则由设备决定。

PCI设备配置空间如下图所示:

88d908125ffd50791e59cf6fc206676f.png

下面对配置空间进行简单介绍(这一段可以对照笔者的文章 《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(12) 以及后续文章)。

Vendor ID、Device ID、Class Code用来表明设备的身份 有时 (有些场景下) 还会设置Subsystem Vendor ID和Subsystem Device ID

6个Base Address表示的是PCI设备的IO地址空间 (BAR寄存器保存PCI设备使用的地址空间的基地址,该基地址保存的是该设备在PCI总线域中的地址), 虚拟机 可以 通过这些地址空间对设备进行读写配置控制 。除了6个BAR,还可能有一个ROM的BAR(Expansion ROM base address 寄存器,有些PCI设备在处理器还没有运行操作系统之前,就需要完成基本的初始化设置)。

有两个与中断设置有关的值, IRQ Line表示设备使用的是哪一个中断号 。如传统的中断控制器由两个82599芯片看级联而成,有0~15号Line, IRQ Line表示的是使用哪一根线 IRQ Pin表示的是PCI设备使用哪一条引脚连接中断控制器 PCI总线上的设备可以通过4根中断引脚INTA~D#向中断控制器提交中断请求 ,这里的IRQ Pin即用来表示这个引脚编号。 1~4分别表示INTA~INTD#的4个引脚 大部分设备使用中断线INTA引脚 如果设备不支持中断,则该域为0

PCI总线能够发送对应的INTA~INTD#4个信号,这4个信号会与中断控制器的IRQ_PIN引脚相连。 PCI总线规范中并没有规定PCI设备的INTx信号与中断控制引脚的连接关系,因此系统软件需要使用中断路由表存放PCI设备的INTx信号与中断控制器的连接关系 中断路由表通常是由BIOS等系统软件建立的

为了 均衡PCI总线上的负载 ,通常 PCI信号与终端信号的连接都是错开的 。如下图所示:

fc9dd2a609f09db7f0e9ac0ecb7c9045.png

插槽A上的设备与插槽B、C上的设备使用不同的信号线连接中断控制器的IRQY#引脚,其它类似。这种连接方式也让每个插槽的中断信号INTA连接到不同的中断设备引脚。

欲知后事如何,且看下回分解。

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他