日期:2014-05-16  浏览次数:20808 次

pci总线上这么多设备怎么区分彼此的?
就是怎么在driver设计中 pci总线上这么多设备怎么区分彼此的?区分彼此开来 ?使用次设备号吗,但是cpu怎么区分对应的pci设备

------解决方案--------------------
cpu和pci设备之间隔着pci总线控制器或者pci桥
cpu的内存地址空间和pci总线地址空间是相互独立的隔离的,只是大多数cpu架构(x86)都是简单地把这2种地址不加任何偏移地一一映射。但是驱动程序员这个概念要分清。
cpu首先要访问pci控制器,pci控制器访问pci设备

pci设备有3种空间:配置空间、IO空间、mem空间,所以要区分每个pci设备就需要完全区分这3种空间。

其中mem空间就是pci设备分得的pci总线地址,每一个pci设备分得的pci地址空间是不会重叠的。cpu通过pci总线控制器访问不同的pci地址空间,就能访问到不同的pci设备。
pci IO空间是被淘汰的概念,与pci mem空间类似,每个pci 设备的pci io地址不一样。

比较特殊的是pci配置空间,但是没有pci配置空间,也就不可能配置IO空间和mem空间。
每个pci设备(这里只逻辑设备,一个pci物理设备可以有多个逻辑设备,就是所谓的多功能pci设备)的配置空间的地址,是一个32位的地址。由总线号+槽位号+功能号组成。
pci总线控制器决定了pci总线号。
每个pci总线控制器和pci设备相连时,有一根IDSEL信号线。IDSEL信号,一端接在pci设备的IDSEL端,另一头接在pci总线控制器的pci地址线AD[31:11]其中的一个(不会有2根IDSEL接在同一条AD[31:11]上)。这个独特的连接,决定了pci设备的slot号。
每个pci物理设备,可能含有多个逻辑设备,就是func号。

由总线号+槽位号+功能号组成的唯一的32位地址区分开pci的设备空间。

至此,pci设备的3种空间完全区分开了,每个pci设备也就区分开了。