1 一:前言 Pci,是 Peripheral Component Interconnect 的缩写,翻译成中文即为外部设备互联
与传统的总线相比
它的传输速率较高
能为用户提供动态查询 pci deiv ce
和局部总线信息的方法,此外,它还能自动为总线提供仲裁
在近几年的发展过程中,被广泛应用于多种平台
pci 协议比较复杂,关于它的详细说明,请查阅有关 pci 规范的资料,本文不会重复这些部份
对于驱动工程师来说,Pci 设备的枚举是 pci 设备驱动编写最复杂的操作
分析和理解这部份,是进行深入分析 pci 设备驱动架构的基础
我们也顺便来研究一下,linu x 是怎么对这个庞然大物进行封装的
二:pci 架构概貌 上图展现了pci 驱动架构中,pci_bu s、pci_dev 之间的关系
如上图所示,所有的根总线都链接在 pci_root_bu ses链表中
Pci_bu s ->dev ice 链表链接着该总线下的所有设备
而 pci_bu s->children 链表链接着它的下层总线
对于 pci_dev 来说
pci_dev ->bu s 指向它所属的 pci_bu s
Pci_dev ->bu s_list 链接在它所属 bu s 的 dev ice 链表上
此外,所有 pci 设备都链接在 pci_dev ice 链表中
三:pci 设备的配置空间 每个pci 设备都有最多 256 个连续的配置空间
配置空间中包含了设备的厂商 ID,设备 ID,IRQ,设备存储区信息等
摘下 LDD3 中的一副说明图,如下: 2 要注意了,上图是以字节为单位的,而不是以位为单位
那怎么去读取每个设备的配置空间呢
我们在开篇的时候提到过,pci 总线为用户提供了动态查询pci 设备信息的方法
在x86 上,保留了0xCF8~ 0xCFF 的8 个寄存器