上个章节,我们了解了:当数据包通过结构从一个系统传输到另一个系统时进行地址转换,这是通过非透明桥(Non-Transparent)完成的。NT桥到底是怎么进行地质转换的?NT桥的内部构造又是啥样的呢?
NT桥的内部,其实是两个Endpoint设备。NT桥将一个透明端口分成两个非透明端口(端点设备/功能)。透明桥的配置空间为Type1,非透明桥的配置空间则为Type0。同时,NT桥中的两个NT EP都有各自的Type0配置空间。如下图:
既然是EP,我们知道每个EP都有6个BAR空间。BAR 0 到BAR 5。所谓BAR(Base Address Register)就是每个EP设备的一个寄存器,这个寄存器会向系统申请一段一定大小的空间地址,系统所有访问这个空间地址的报文,都会被路由到这个EP来处理。
通常,BAR0是用作映射到EP设备的配置空间,访问BAR0可以映射访问所有的寄存器。而NT的BAR2 到 BAR5通常都是用于NT桥接地址转换用的。如下,我们以BAR 2为例:
进入NT Window的报文,会根据我们自己设置的NT桥转换基址(Translated Base Addres)做运算,运算之后的地址刚好要等于我们想访问的B系统里面的目标地址(Target Adress)。这样,即使我们加上一定的偏移(Offset),也能顺利转化为B系统里对应偏移的地址。
T地址转换的基本原理就是这样。需要注意的是,如果只是写请求,那么只需要地址翻译、转换就可以了。但如果是Non-Post的事务,这个时候需要的是ID 路由(ID Routing)。情况变得会复杂一些。我们知道请求TLP包含一个请求者ID字段,该字段定义了一个PCIe系统里面的唯一ID,代表生成请求TLP的请求者。当这个读请求包穿过NT桥的时候,如果不进行任何处理,会有两个问题:
1、 因为每个系统里的ID都是唯一的,那么A系统的ID穿过NT桥后,有可能和B系统里面的ID冲突。
2、 完成报文是包含请求者ID字段和完成者ID字段。归属A系统的ID在B系统里可能根本找不到。完成报文不知道该发到哪里去。
因此,NT桥同时也需要完成ID转换和翻译。这部分的内容,大家可以参考芯片厂商的手册。
了解完大概的转换原理之后,我们跳出来再看一看这个系统图:
大家注意一下我标注的不同的颜色,从PCIe域以及地址归属来看,NT桥两边的两个EP设备,其实是分别归属于两个系统的(蓝色属于系统A,绿色属于系统B)。至于两个NT EP中间的NT Bridge,那是厂商芯片自己内部的实现。逻辑上在两个系统内都看不到哦。
另外,我们前面只讨论了从系统A到系统B穿过NT桥的转换,反之,从系统B到系统A类似,只不多是在B系统里面配置绿色的NT EP设备而已。我们可以画出如下的地址转换示意图。注意:此图两边地址是完全对称的,实际应用是比较常见的。事实上两边窗口、地址、转换目标地址等都是完全独立的,可以分别配置成不同的内容。