原文:NTB Drivers — The Linux Kernel documentation
译者:jklincn <jklincn@outlook.com>
日期:2024.03.07
NTB 驱动程序
NTB(Non-Transparent Bridge,非透明桥)是一种 PCI-Express 桥接芯片类型,它将两台或更多计算机的独立内存系统连接到同一个 PCI-Express 结构上。现有的 NTB 硬件支持一个通用功能集:门铃(原文:doorbell)寄存器和内存转换窗口,以及非通用功能,如便笺(原文:scratchpad)寄存器和消息寄存器。便笺寄存器是可从设备任意一端访问的读写寄存器,因此对等方可以在一个固定的地址交换少量信息。消息寄存器可以用于相同的目的。此外,它们还提供了特殊的状态位,以确保信息不会被另一个对等方重写。门铃寄存器为对等方提供了一种发送中断事件的方式。内存窗口允许对对等方的内存进行转换后的读写访问。
NTB 核心驱动(ntb)
NTB 核心驱动定义了一个封装通用功能集的 API,并允许对 NTB 功能感兴趣的客户端发现硬件驱动支持的 NTB 设备。这里的“客户端”是指调用 NTB API 的上层组件。而“驱动”或“硬件驱动”是指针对特定厂商和型号的 NTB 硬件驱动程序。
NTB 客户端驱动
NTB 客户端驱动应当向 NTB 核心驱动注册。注册后,当 NTB 硬件或硬件驱动插入和移除时,客户端的探测和移除函数将会适当地被调用。注册使用的是 Linux 设备框架,因此对于任何编写过 PCI 驱动的人来说应该感觉很熟悉。
NTB 典型客户端驱动实现
NTB的主要目的是在至少两个系统之间共享一部分内存。因此,像便笺/消息寄存器这样的NTB设备功能主要用于执行正确的内存窗口初始化。通常,NTB API支持两种类型的内存窗口接口:在本地 NTB 端口上配置的入站转换和在对等 NTB 端口由对等方配置的出站转换。第一种类型如下图所示:
Inbound translation:
Memory: Local NTB Port: Peer NTB Port: Peer MMIO:
____________
| dma-mapped |-ntb_mw_set_trans(addr) |
| memory | _v____________ | ______________
| (addr) |<======| MW xlat addr |<