现在看到,有的网卡的名字叫 Realtek PCIe GBE xxxx Controller 类似;想想以前折腾机箱的时候肯定听过PCI的名字;下面来看一下PCI和PCIe的概念;以及相关的BIOS操作,作为一名程序员可以了解;
一 PCI总线
PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。PCI插槽也是主板带有最多数量的插槽类型,在目前流行的台式机主板上,ATX结构的主板一般带有5~6个PCI插槽,而小一点的MATX主板也都带有2~3个PCI插槽。
PCI总线结构
PCI总线是一种树型结构,并且独立于CPU总线,可以和CPU总线并行操作。PCI总线上可以挂接PCI设备和PCI桥片,PCI总线上只允许有一个PCI主设备,其他的均为PCI 从设备,而且读写操作只能在主从设备之间进行,从设备之间的数据交换需要通过主设备中转。
PCI总线取代了早先的ISA总线。
总线设备
在PCI总线中有三类设备,PCI主设备、PCI从设备和桥设备。其中PCI从设备只能被动地接收来自HOST主桥,或者其他PCI设备的读写请求;而PCI主设备可以通过总线仲裁获得PCI总线的使用权,主动地向其他PCI设备或者主存储器发起存储器读写请求。而桥设备的主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。
二 PCIe
PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。
PCIe比以前的标准有许多改进,包括更高的最大系统总线吞吐量,更低的I/O引脚数量和更小的物理尺寸,更好的总线设备性能缩放,更详细的错误检测和报告机制(高级错误报告,AER)和本机热插拔功能。 PCIe标准的更新版本为I/O虚拟化提供了硬件支持。
在总线协议方面,PCI Express通信封装在数据包中。打包和解包数据和状态消息流量的工作由PCI Express端口的事务层处理,电信号和总线协议的根本差异需要使用不同的机械外形尺寸和扩展连接器(因此,需要新的主板和新的适配器板); PCI插槽和PCI Express插槽不可互换。
在软件级别,PCI Express保留与PCI的向后兼容性; 传统的PCI系统软件可以检测和配置较新的PCI Express设备,而无需显式支持PCI Express标准,但是新的PCI Express功能无法访问。
三 PCI设备初始化
系统初始化时扫描PCI总线上的各个PCI设备(包括网卡),为这些设备分配总线地址,并建立起其卡上地址和总线地址的映射,那映射是怎么建立起来的?
每个PCI设备上都有用来建立映射的配置寄存器组(配置空间),系统初始化时通过这组寄存器来为设备"配置"总线地址,那CPU怎么访问这组寄存器呢?
PCI标准规定配置寄存器组最大256 byte,其中开头64 byte是标准的(对每个PCI设备都一样),所有PCI设备的配置寄存器组都使用相同的地址(卡上地址或偏移量);
系统在IO地址空间预留了八个字节(0xCF8~0xCFF),其中前四个字节做地址寄存器,后四个字节做数据寄存器,当CPU访问某个设备的某个配置寄存器时,首先通过I/O命令向地址寄存器写入目标地址(包括总线号、设备号、功能号、寄存器地址的综合地址),然后通过I/O命令读写数据寄存器;
探测PCI设备
配置寄存器组中的Header Type为0表示普通PCI设备、为1表示PCI桥,PCI桥根据功能又分为Host-PCI桥、PCI-PCI桥、PCI-ISA桥、PCI-CardBus桥等;
每个PCI总线都挂在一个PCI桥下,其中0号总线挂在Host-PCI桥下(CPU通过Host-PCI桥连到0号总线),所有总线组成一颗总线树;
直接探测
探测PCI设备有BIOS探测和直接探测两种方式,两者都是从Host-PCI桥开始深度优先搜索总线树上的所有设备;
四 PCI BIOS
通过执行INT 1AH指令可以调用16位的PCI BIOS,也可以直接在物理寄存器位置000FFE6EH调用PCI BIOS。32位BIOS的调用要通过一个远程调用来实现。在这两种情况下,调用这都必须首先将需要的请求参数装入处理器的寄存器组。在入口AH寄存器必须包含PCI的功能ID:B1H,AL寄存器必须包含PCI下级功能识别器。
1 PCI BIOS的存在性
入口参数:AH=B1H AL=01H
出口参数:
EDX:返回值为“PCI”。字符“P”存放在DL;字符“C”存放在DH;字符“I”存放在EL;EH中方一个空格符
AH:存在状态。如果EDX设置适当,则00H表示存在PCI BIOS。
AL:硬件机制
BL:接口版本
CL:系统中最后一个PCI局部中线的号码
CF:状态标志。为1表示没有PCI BIOS,为0表示存在PCI BIOS。
2 PCI设备检测
入口参数:
AH=B1H AL=02H
CX=设备识别号,从0 - 65535
DX=供应商识别代码,从0 - 65534
SI=索引号,0-N
出口参数:
BH=总线号
BL=高5位为设备号,低3位为功能号
AH=返回3种不同的代码。00H表示检测成功,86H表示未发现要检测的设备,83H表示入口参数中的供应商代码无效
CF=状态标志。为1表示检测错误,为0表示检测成功。
3 PCI分类代码检测
入口参数:
AH=B1H AL=03H
ECX=低三个字节为分类代码
SI=索引号,0 - N
出口参数:
BH=总线号,0-255
BL=高5位为设备号,低3位为功能号
AH=00H表示检测成功,86H表示未发现要检测的设备
CF=1表示检测错误,0表示检测成功
如果在该功能调用中,使索引号从1开始以1位增量递增,直到AH中的返回码为86H为止,便可检测出具有相同分类代码的所有设备。
其他BIOS功能调用包括:
特殊周期的产生
读配置字节
读配置字
读配置双字
写配置字节
写配置字
写配置双字