124、PCIE交换机内部路由表:一次真实调试的启示
124、PCIE交换机内部路由表:一次真实调试的启示上周实验室里一块新到的PCIe交换机开发板让我们折腾了整整两天。现象很诡异:主机能识别到交换机上游端口,但下游挂的NVMe盘死活不出来。用lspci命令只能看到交换机本身,下游设备像消失了一样。这种问题在PCIe拓扑扩展场景中太典型了——多半是路由表没配对。路由表不是你想的那样简单很多人第一次接触PCIe交换机时,会下意识把它当成网络交换机。但PCIe交换机的路由机制完全不同:它不依赖MAC地址或IP,而是基于PCIe总线/设备/功能号(BDF)的硬路由。每个进入交换机的TLP包都带着目标BDF,交换机查表决定从哪个下游端口出去。路由表就藏在交换机的配置空间里,特别是Type1头设备的Base Address Register(BAR)和Bus Number寄存器区域。关键寄存器就那几个:Primary Bus Number(上游总线号)、Secondary Bus Number(下游总线号)、Subordinate Bus Number(下游子树最大总线号)。这三个数字定义了一段总线号范围,决定了哪些请求该往下游转发。调试现场还原当时我们用的是一款主流厂商的PCIe Gen3交换机芯片。先掏出配置空间查看工具,发现Secondary Bus Number被初始化成了0xFF——明显不对。正常情况应该是上游总线号+1开始分配。用下面这段伪代码逻辑检查路由:/