正文
端点设备的CSR中有一个“Type 0”标头,用于通知枚举器(BIOS或处理器)下游没有其他设备了。这些CSR包括用于向主机请求内存和I/O孔的基址寄存器(BAR)。
*PCI bus number
的分配
非透明桥NTB的工作原理
NTB提供处理器域分区,并在这些域的内存映射空间之间进行地址转换。这样一来,NTB在电气隔离上添加了逻辑隔离。 使用NTB,网桥任一侧的设备(比如PCIe gen5 的SSD) 从另一侧都不可见,但为处理器域之间的数据传输和状态交换提供了一条路径。
在上图这个例子中,系统主机将通过图2左侧分支上的网桥A和B(都是透明的)进行枚举,直到到达端点X。在右侧分支上,主机将在网桥D(NTB-D)停止枚举。同样,图右下角的本地CPU将通过网桥E和F(均为交换机内的虚拟网桥)枚举并发现端点Y,但不会尝试发现网桥D之外的元素。这就导致形成了两个内存域。
地址转换
在NTB环境中,PCI
Express系统需要将地址从一个内存空间转换到另一个内存空间。每个NTB端口有两组BAR,一组用于主级侧,另一组用于次级侧。BAR用于将地址转换窗口(address
translating windows)定义为NTB另一侧的内存空间,并允许将事务映射到本地内存或I/O。
*NTB中,地址转换窗口(address translating windows)是一种关键机制,用于实现不同 PCIe 域之间的地址映射和数据通信。
地址转换窗口是 NTB 中用于定义一个地址范围的逻辑区域,这个区域建立了源地址空间和目标地址空间之间的映射关系。通过地址转换窗口,系统能够将一个 PCIe 域(源域)中的地址转换为另一个 PCIe 域(目标域)中的对应地址,从而实现两个域之间的数据传输。
不同 PCIe 域可能使用不同的地址空间,地址转换窗口提供了一种方式,将源域的地址映射到目标域的地址,使得设备能够正确地访问另一个域中的资源。
地址转换窗口限定了哪些地址范围的数据可以在两个 PCIe 域之间进行传输,只有落在地址转换窗口所定义地址范围内的事务才会被允许通过 NTB 进行跨域传输,增强了数据传输的可控性和安全性。
在系统初始化时,软件会对 NTB 进行配置,为地址转换窗口设置源地址范围和对应的目标地址范围,以及其他相关的属性(如访问权限等)。这个过程就像创建了一张地址映射表,记录了源地址和目标地址之间的对应关系。
当一个 PCIe 设备发起一个跨域的事务请求时,NTB 会检查该请求的地址是否落在某个已配置的地址转换窗口的源地址范围内。如果是,NTB 会根据预先建立的映射关系,将源地址转换为目标地址,并将事务转发到目标 PCIe 域中的相应设备。
通常通过读写 NTB 的特定配置寄存器来设置地址转换窗口的参数,包括源地址起始值、源地址范围大小、目标地址起始值等。这些寄存器可以由操作系统或设备驱动程序进行访问和配置。
假设在一个包含两个 PCIe 域(域 A 和域 B)的系统中,域 A 中的设备想要访问域 B 中的内存资源。通过配置 NTB 的地址转换窗口,将域 A 中地址范围为
0x1000 - 0x1FFF
的地址映射到域 B 中地址范围为
0x2000 - 0x2FFF
的地址。当域 A 中的设备发起一个对地址
0x1500
的访问请求时,NTB 会将该地址转换为
0x2500
,并将请求转发到域 B 中对应的内存位置。
每个BAR都有一个设置寄存器,用于定义窗口的大小和类型,还有一个地址转换寄存器。虽然透明网桥根据总线号转发所有CSR,但NTB设备只接受发给自己的CSR事务。有两种转换技术:分别基于直接地址转换(Direct Address Translation)和查找表转换(lookup-table-basedTranslation)。
直接地址转换Direct Address Translation:
在直接地址转换中,所有事务的地址转换方式是,在事务终结所在的
BAR 的基地址上加上一个偏移量。也就是说,通过这种方式把事务的原始地址转换为设备实际可处理的地址。BAR中的基本翻译寄存器Base
translation registers用于设置这些翻译。图3说明了从主级侧地址映射到次级地址映射的这种转变。
*
“这个事务在该 BAR 中终结” 的含义
事务是指一次完整的数据传输操作,比如一次内存读写操作、I/O 操作等。它包含发起方(请求者)和目标方(响应者),以及相关的地址、数据和控制信息。
“这个事务在该
BAR
中终结”意味着一个事务的目标地址(也就是事务要访问的最终地址)落在某个特定的基址寄存器所定义的地址范围内。当发起一个事务时,系统会检查事务的目标地址,看它是否处于某个
BAR 所指定的地址区间内。如果是,就可以说这个事务在该 BAR 中终结(terminates),因为该 BAR 所对应的设备将处理这个事务。
假设一个 PCIe 设备有两个 BAR:
-
BAR0 定义的地址范围是
0x1000 - 0x1FFF
。
-
BAR1 定义的地址范围是
0x2000 - 0x2FFF