一、非透明桥(NTB)概念解析

1.1 什么是非透明桥

非透明桥,英文叫 Non-Transparent Bridge,简称 NTB。说白了,它就是一种特殊的 PCIe 桥接设备。

普通 PCIe 桥,比如我们常见的 Switch 内部的透明桥,它做的事情很简单——把数据从上游端口转发到下游端口,或者反过来。CPU 能看到下游所有的设备,枚举的时候一清二楚。

但 NTB 不一样。它会在两个独立的 PCIe 域之间建立一条「秘密通道」。两个域的主机互相看不见对方的设备,就像隔了一堵墙。墙中间开了一扇门,数据可以通过门传递,但彼此的设备列表里没有对方。

我刚开始接触 NTB 时,也觉得这个概念有点绕。后来在项目中调试一个双主机通信的问题,才真正理解了它的设计意图。

核心定义:NTB 是一种特殊的 PCIe 桥接设备,它在两个独立的 PCIe 域之间提供受控的通信通道,同时保持域之间的地址空间隔离。

1.2 NTB 与透明桥的区别

透明桥和非透明桥,名字上就差一个字,但设计思路完全不同。我列个表,你一看就明白。

对比维度 透明桥 非透明桥(NTB)
地址空间 统一地址空间,所有设备可见 隔离地址空间,设备不可见
CPU 枚举 CPU 能枚举到桥下所有设备 CPU 看不到对端设备
数据传递 直接转发,无需软件干预 需要软件配置和地址映射
典型应用 普通 PCIe 扩展 双主机通信、故障隔离
安全性 低,任何设备都可访问 高,访问受控

你想想看,透明桥就像一扇敞开的门,谁都能进。NTB 则是一扇带锁的门,只有拿到钥匙的人才能通过。

我记得有一次调试一个多主机系统,客户要求两个 CPU 之间共享数据,但又不能互相干扰。透明桥的方案根本行不通,因为一旦连上,两个 CPU 的地址空间就混在一起了。最后就是用 NTB 解决的。

1.3 NTB 在 PCIe Switch 中的角色

PCIe Switch 内部通常包含多个桥。大部分是透明桥,用于连接下游设备。但 NTB 在 Switch 中扮演一个特殊的角色——它负责连接两个独立的 PCIe 域。

来看一张图,这是我画的一个典型 NTB 应用场景。

主机 A 主机 B PCIe Switch 透明桥 NTB 设备 1 设备 2 隔离域 NTB 连接两个独立 PCIe 域 透明桥连接域内设备 域 A 域 B

图中可以看到,PCIe Switch 内部既有透明桥,也有 NTB。透明桥负责连接域内的设备,NTB 则负责连接两个域。中间的虚线就是隔离墙,两个域的主机互相看不见对方的设备。

嗯,这里要注意:NTB 在 Switch 中不是必须的。很多 Switch 芯片只提供透明桥功能。只有当你需要做域间隔离或双主机通信时,才会用到 NTB。

1.4 NTB 的核心价值:隔离与桥接

NTB 的核心价值就两个词:隔离和桥接。听起来矛盾,但恰恰是它的精髓。

隔离

隔离是什么意思?就是两个 PCIe 域之间互不干扰。

  • 地址空间隔离:主机 A 的地址映射不会影响主机 B。两个域可以独立管理自己的内存和 I/O 空间。
  • 故障隔离:一个域的设备挂了,不会影响另一个域。我曾经遇到过,一个域里的 SSD 控制器崩溃,导致整个域的总线复位。但因为 NTB 的隔离,另一个域完全不受影响,业务照常运行。
  • 安全隔离:未经授权的访问被挡在门外。只有通过 NTB 配置的映射窗口,数据才能跨域传递。

避坑指南:我曾经在配置 NTB 窗口时,忘记设置地址翻译范围,结果对端主机只能访问前 4KB 的数据。调试了两天才发现是窗口大小没配对。所以,配置 NTB 时一定要仔细检查地址映射的基地址和大小。

桥接

隔离不是目的,目的是在隔离的基础上实现受控的通信。这就是桥接的作用。

  • 数据交换:通过 NTB 的地址映射窗口,两个域可以互相读写对方的内存。就像在墙上开了一扇窗,数据可以传递。
  • 中断传递:NTB 支持门铃(Doorbell)机制,一个域可以发送中断给另一个域。我做过一个项目,用门铃机制实现了两个 CPU 之间的消息通知,延迟只有几微秒。
  • 共享内存:通过 NTB 的映射,两个域可以共享一段物理内存。这比传统的网络通信快得多,因为走的是 PCIe 总线,延迟极低。

注意事项:NTB 的桥接功能不是自动的。你需要写驱动程序来配置 NTB 的地址映射窗口、门铃寄存器、消息寄存器等。很多工程师以为 NTB 插上就能用,结果发现数据传不过去。嗯,NTB 是需要软件配合的硬件功能。

1.5 实际项目中的体会

我参与过一个存储系统的设计,两个控制器之间需要高速数据同步。最初用的是以太网,延迟在几十微秒级别,性能不够。后来改用 NTB,延迟降到了微秒级,吞吐量也翻了几倍。

但 NTB 也不是万能的。它的配置比透明桥复杂得多。透明桥插上就能用,NTB 需要仔细设计地址映射、中断路由、数据一致性等。我记得第一次调 NTB 驱动时,光是地址翻译就折腾了一周。

不过话说回来,一旦你掌握了 NTB 的配置方法,它在隔离和通信方面的优势是其他技术无法替代的。尤其是在多主机系统、故障容错、安全隔离这些场景下,NTB 几乎是唯一的选择。

好了,这一节的内容就到这里。NTB 的概念其实不复杂,关键是要理解它「隔离中通信」的设计思想。下一节我们会深入 NTB 的硬件架构,看看它内部是怎么工作的。


专注资料整理