首页 理论教育 操作系统实现之路:PCI配置空间的读取与设置

操作系统实现之路:PCI配置空间的读取与设置

时间:2023-10-21 理论教育 版权反馈
【摘要】:在读/写PCI设备的配置空间时分两步进行。向预留端口CF8输出要读取的PCI设备标识信息,以及要读取的配置空间的偏移,所有这些信息组织成一个32bit的双字,如图9-8所示。比如,要写入PCI设备配置空间的Interrupt Line字段,可以这样进行:这样就把“8”写入了位于PCI总线0上的设备8、功能0的配置空间中的Interrupt Line寄存器内。

操作系统实现之路:PCI配置空间的读取与设置

个人计算机(PC)上,HOST-PCI桥接器(北桥)直接连接了CPU和内存,对于PCI上设备配置空间的读取也是通过HOST-PCI桥接器进行的,按照PCI规范的定义,HOST-PCI桥接器使用端口范围0xCF8~0xCFF,这样就可以通过读/写这些端口号对PCI设备的配置空间进行读取或写入操作。在读/写PCI设备的配置空间时分两步进行。

(1)向预留端口CF8(十六进制)输出要读取的PCI设备标识信息(包括PCI总线号、设备号、功能号等),以及要读取的配置空间的偏移,所有这些信息组织成一个32bit的双字,如图9-8所示。

978-7-111-41444-5-Chapter09-28.jpg

图9-8 PCI总线操作命令字结构

其中,第31bit固定为1,16~30bit是总线标识符,11~15bit则是设备号,8~10bit是功能号(一个PCI设备,最多可以支持8种不同的功能),最后8bit则是要读取的配置空间数据的偏移。比如,一块PCI接口的网络接口卡,位于PCI总线1上,设备ID是8,功能ID为0(只有一种功能),要读取配置空间的第一个双字(4B),则首先需要向CF8端口输出80014000(十六进制)。

(2)读取CFC端口,以双字的方式,就可以获得上述设置的配置空间内相应的内容。

对于直接连接在HOST-PCI桥接器的PCI总线,总线号总是0。比如,要读取PCI设备配置空间中的Vendor ID和Device ID字段,可以这样做(假设设备位于总线0、设备号8、功能号0):(www.xing528.com)

978-7-111-41444-5-Chapter09-29.jpg

对于PCI设备配置空间的写入操作与此类似,首先向端口CF8写入目标地址(包含总线号、设备号、功能号、偏移等),然后向CFC端口写入一个长字。比如,要写入PCI设备配置空间的Interrupt Line字段,可以这样进行:

978-7-111-41444-5-Chapter09-30.jpg

978-7-111-41444-5-Chapter09-31.jpg

这样就把“8”写入了位于PCI总线0上的设备8、功能0的配置空间中的Interrupt Line寄存器内。需要注意的是,一般建议以32bit为单位进行读/写,因此,在进行写入操作的时候,如果写入的字段小于4B(上面Interrupt Line只有8bit),则首先读出4B,然后修改要写入的部分,再把4B整体写入配置空间。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈