UEFI——访问PCI/PCIe设备(一)

UEFI——访问PCI/PCIe设备(一)PCI PeripheralCo PCI 的中文为外围组件互联 所谓的外围组件指的是 CPU 内存和芯片组以外的设备 这些设备通常通过各种接口连接到计算机的主板上

大家好,欢迎来到IT知识分享网。

一、PCI/PCIE

1.1 PCI/PCIe简介

PCI(Peripheral Component Interface,PCI)的中文为外围组件互联,所谓的外围组件指的是CPU、内存和芯片组以外的设备,这些设备通常通过各种接口连接到计算机的主板上,以扩展计算机的功能和性能,例如磁盘、网卡、声卡、显卡等。其主要目的是连接周边设备,将低速的设备与高速的处理器结合起来,以解决用户对数据传输速率越来越高的要求。PCIe (PCI Express),PCI扩展是在PCI的基础上发展而来的,最大的区别在于PCI采用并行传输,PCIE采用串行。

Link:两个PCIe设备之间的物理连接,一个link由多条lane组成,lane的数量决定了Link的宽度,即x值,例如8x Link表示包含8各lane 16x包含16个lane

UEFI——访问PCI/PCIe设备(一)

PCIe采用双单工模式进行连接,即每条lane中有一条单路发送路径,一条单路接收路径。 

 UEFI——访问PCI/PCIe设备(一)

1.2 PCIe 拓扑结构

PCie的拓扑如下图所示:

UEFI——访问PCI/PCIe设备(一)

PCIe拓扑结构是一个树形拓扑,主要包含 Root Complex、PCIe BUS、Endpoint、Port and Bridge、Switch

Root Complex:是PCIe设备树的根节点,CPU通过它与PCIe的总线相连,并最终连接到所有的PCIe设备上。(现在基本上集成在CPU中)虽然是设备树的根节点,但Root Complex并不是只有一个。

PCIe总线(Bus):PCIe上的设备通过PCIe总线互相连接,PCIe Bus是一个点对点的网络,当Root Complex或者PCIe上的设备之间需要通信的时候,它们会与对方直接连接或者通过交换电路进行点对点的信号传输。

UEFI——访问PCI/PCIe设备(一)

Endpoint:端点就是PCIe拓扑中的设备,不是交换机、桥接器,而是起作用的设备 

Switch:交换机,作用就是拓展PCIe端口,并为挂在它上面的设备提供路由和转发功能。 

Port and Bridge:

 PCIe设备具有两种类型:type0表示最终端的设备,例如我们常见的显卡、网卡、声卡;type1表示switch或Root port,用来连接其它PCIe设备

UEFI——访问PCI/PCIe设备(一)

1.3  BDF

BNF(Bus Number,Device Number,Function Number),PCIe上的所有设备,无论是type0还是type1,在系统启动的时候,都会分配一个唯一的地址,它由三部分组成:

Bus Number:8bits,也就是最多256条总线

Device Number:5bits,最多32个设备

Function Number:3bits,最多8个功能

二、UEFI环境下访问PCI/PCIe设备

2.1 与PCI/PCIe设备通信的机制

在这里主要讨论的是在UEFI环境下访问PCi和PCIe设备。站在软件工程师的角度,在访问PCI/PCIe设备时,只需要回答两个问题就行了。

(1)如何在系统中找到要访问的设备

(2)找到设备以后,如何访问设备内的寄存器或其它资源

2.1.1 如何找到PCIe设备呢?

在UEFI规范中,抽象了PCI的系统结构,典型的桌面系统的PCI架构如图所示:

UEFI——访问PCI/PCIe设备(一)

一般的桌面系统只有一个PCI Host Bus(PCI主机总线),用于完成CPU和PCI设备之间的数据交换。PCI Root Bridge(PCI根桥)一般也只有一个,它管理一个局域总线,下挂一个PCI总线树。我们要访问的PCI设备,就挂在这颗总线树上,它们属于同一总线空间。如下所示:

UEFI——访问PCI/PCIe设备(一)

PCI总线树上包含PCI总线、PCI桥和PCI设备。系统通过三段编码的方式进行编码,即通过Bus Number(总线号),Device Number(设备号)、Function(功能号)来编码,这种编码一般简称为 BDF码。BDF码在BIOS进行PCI总线扫描和枚举过程中确定,可以用来作为查找PCI设备的索引。

找到PCI设备后,如何确定此设备就是自己要找的设备呢?每个PCI设备,除了主总线桥外,都会实现配置空间(PCIe configuration space),在配置空间中,包含了设备厂商用来标识自身的Vendor ID(供应商ID)和Device ID(设备ID)。通过对比PCI设备的Vendor ID和Device ID可以确定所找的设备是否为目标设备。

以X86平台为例,可通过CONFG_ADDR寄存器(0xCF8)和CONFG_DATA寄存器(0xCFC),以BDF码的形式访问PCI设备,以得到设备的配置空间。

UEFI——访问PCI/PCIe设备(一)

PCI设备的基本配置空间由64字节组成,地址范围为0x00~0x3F,主要用来识别设备、定义主机访问PCI卡的方式。 还包含了6个基地址寄存器,这组寄存器被称为BAR,保存了PCI设备使用的地址空间的基地址,也就是该设备在PCI总线域中的地址。每个设备最多有6个基址空间,但不一定全用。

BAR可寻址IO地址空间或者内存地址空间,其最低位为只读位,显示了可以访问哪种地址空间。

UEFI——访问PCI/PCIe设备(一)

 2.1.2 如何访问PCI设备内的寄存器和其他资源呢?

通过BAR寄存器,加上内部寄存器相对于BAR的偏移地址就可以得到PCIe设备内的各种寄存器或其他资源的位置了。在芯片手册中会提供内部资源的使用说明。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129164.html

(0)
上一篇 2025-08-26 14:26
下一篇 2025-08-26 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信