Notes about NTB(Non-Transparent Bridge)。大部分内容转载自:非透明桥 Non-Transparent Bridging

1. Background

问:系统A的CPU有没有可能直接访问系统B的内存和外设呢?
答:有!PCIe Non-Transparent Bridging功能就可以实现,也就是非透明桥!

我们首先来回顾一下PCIe系统里面,数据包的路由方式。以地址路由为例:

PCIe系统里面,每个设备、每个Switch,都有明确的属于自己的地址、地址范围。数据包在系统里面,根据某个确定的地址路由、寻址。每个地址具有唯一性。下面,让我们考虑两个PCIe系统的场景:

系统A如果需要访问到另外一个系统B的某个地址,存在两个问题:

  1. 通过什么物理路径?
  2. 假设解决了问题1,同样存在地址冲突的问题:例如A系统访问地址2500h,这个地址在A系统里存在于左下方的Switch下,同时这个2500h地址也存在于B系统里的左下方的Switch下。由系统A的CPU发起的2500h地址访问,到底该访问哪一个呢?

为什么两个host系统不能通过透明桥连接?PCIe数据路由是基于地址的,两个系统可能资源分配冲突,这意味着两个设备具有相同的资源分配,因此具有该地址的数据包无法正确路由

解决方案是什么?当数据包通过结构从一个系统传输到另一个系统时进行地址转换,这是通过非透明桥(NT)完成的。

我们来看看传统透明桥的路由:

①某个访问地址1500h的数据报文到达上行口P-P桥,P-P桥一看,这个地址在我的窗口范围内,向下行端口转发。
②图中高亮的下行端口P-P透明桥,一看,这个地址在我的桥下窗口范围内,继续向下转发。
③穿过透明P-P桥的数据报文,地址仍然为1500h。

对比透明桥,非透明桥的路由如下:

①某个访问地址Δ + 1500h的数据报文到达上行口P-P桥,P-P桥一看,这个地址在我的窗口范围内,向下行端口转发。
②图中高亮的下行端口P-P透明桥,一看,这个地址在我的桥下窗口范围内,继续向下转发。
③穿过非透明P-P桥的数据报文,地址进行了翻译!从Δ +1500h变成1500h
④⑤是数据报文在系统B里的路由。

有意思了!非透明桥NT经过一个简单的地址翻译,把在A系统中的地址,翻译到了对应的B系统的地址!这里需要注意的是:

  1. 为什么是Δ + 1500h?因为如果是1500h的话,肯定和本系统的1500h冲突。
  2. Δ + 1500h所在的资源范围是怎么申请的?是非透明桥NT的BAR资源,向系统申请的。

可以看出:非透明桥和透明桥看上去功能很像,最大的不同是:透明桥是进来什么地址,出去就是什么地址,对于桥上下两侧是“透明”的。非透明桥是有翻译功能的,可以把一个地址翻译成另一个地址。所谓非透明的部分意义也是在于此。

2. 地址转换与内部构造

当数据包通过结构从一个系统传输到另一个系统时进行地址转换,这是通过非透明桥(Non-Transparent)完成的。NT桥到底是怎么进行地址转换的?NT桥的内部构造又是啥样的呢?

NTB由两个PCIe设备组成,每个设备的配置方式都是Type 0,并通过桥接连接。这两个Type 0 PCI设备被称为两个非透明(NT)端点(也称为NT功能)。如下图:

既然是EP就有6个BAR空间。BAR 0 到BAR 5。所谓BAR(Base Address Register)就是每个EP设备的一个寄存器,这个寄存器会向系统申请一段一定大小的空间地址,系统所有访问这个空间地址的报文,都会被路由到这个EP来处理。

通常,BAR0是用作映射到EP设备的配置空间,访问BAR0可以映射访问所有的寄存器。而NT的BAR2 到 BAR5通常都是用于NT桥接地址转换用的。如下,我们以BAR 2为例:

NT EP向系统申请了个两段空间,一个是BAR0,所有访问BAR0地址范围的报文都将落入到EP的内存映射寄存器里面去。另一个就是BAR2,这个BAR2的地址空间,我们称为NT窗口。所有访问BAR2地址范围的报文都将进入NT,然后被地址转换!如何转换的呢?

进入NT Window的报文,会根据我们自己设置的NT桥转换基址(Translated Base Addres)做运算,运算之后的地址刚好要等于我们想访问的B系统里面的目标地址(Target Adress)。这样,即使我们加上一定的偏移(Offset),也能顺利转化为B系统里对应偏移的地址。

了解完大概的转换原理之后,我们跳出来再看一看这个系统图:

大家注意一下我标注的不同的颜色,从PCIe域以及地址归属来看,NT桥两边的两个EP设备,其实是分别归属于两个系统的(蓝色属于系统A,绿色属于系统B)。至于两个NT EP中间的NT Bridge,那是厂商芯片自己内部的实现。逻辑上在两个系统内都看不到。

另外,我们前面只讨论了从系统A到系统B穿过NT桥的转换,反之,从系统B到系统A类似,只不多是在B系统里面配置绿色的NT EP设备而已。我们可以画出如下的地址转换示意图

Summary

A PCI-Express non-transparent bridge (NTB) is a point-to-point PCIe bus connecting 2 systems, providing electrical isolation between the two subsystems. A non-transparent bridge is functionally similar to a transparent bridge except that both sides of the bridge have their own independent address domains. The host on one side of the bridge will not have the visibility of the complete memory or I/O space on the other side of the bridge. To communicate across the non-transparent bridge, each NTB endpoint has one (or more) apertures exposed to the local system. Writes to these apertures are mirrored to memory on the remote system. Communications can also occur through the use of doorbell registers that initiate interrupts to the alternate domain, and scratch-pad registers accessible from both sides.

scratch pad(A small, fast memory for the temporary storage of data)




再次回到文章开头。
问:系统A的CPU有没有可能直接访问系统B的内存和外设呢?
答:有!PCIe Non-Transparent Bridging功能就可以实现,也就是非透明桥!


参考资料:

  1. PCI Express 体系结构导读
  2. Kernel ntb.txt
  3. Linux NTB
  4. PCI-Express Non-Transparent Bridge Support
  5. 非透明桥 Non-Transparent Bridging (一)
  6. 非透明桥 Non-Transparent Bridging (二)
  7. 非透明桥 Non-Transparent Bridging (三)