【Linux内核文档翻译】NTB驱动程序

原文: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 |<====| MW base addr |<== memory-mapped IO|------------|       |--------------|  |  |--------------|

因此,第一种类型的内存窗口初始化的典型场景是:1) 分配一个内存区域,2) 将转换后的地址放入 NTB 配置中,3) 以某种方式通知对等设备已进行初始化,4) 对等设备映射相应的出站内存窗口,从而可以访问共享内存区域。

第二种类型的接口,即由对端设备初始化共享窗口的情况,描绘如下:

    Outbound translation:Memory:        Local NTB Port:    Peer NTB Port:      Peer MMIO:____________                      ______________| dma-mapped |                |   | MW base addr |<== memory-mapped IO| memory     |                |   |--------------|| (addr)     |<===================| MW xlat addr |<-ntb_peer_mw_set_trans(addr)|------------|                |   |--------------|

第二种类型的接口初始化的典型场景是:1)分配一个内存区域,2)以某种方式向对等设备发送转换后的地址,3)对等设备将转换后的地址放入 NTB 配置中,4)对等设备映射出站内存窗口,从而可以访问共享内存区域。

可以看出,所描述的场景可以组合在一个可移植的算法中。

  • 本地设备:
    1. 为共享窗口分配内存
      1. 使用已分配区域的转换后的地址初始化内存窗口(如果不支持本地内存窗口初始化,此操作可能会失败)
      1. 将转换后的地址和内存窗口索引发送给对等设备
  • 对等设备:
    1. 使用检索到的由另一个设备分配的内存区域地址来初始化内存窗口(如果不支持对等内存窗口初始化,此操作可能会失败)
    2. 映射出站内存窗口

根据这个场景,NTB 内存窗口 API 可以如下使用:

译者注:下文提及的 pidx 指端口索引(port index),midx 指内存窗口索引(memory window index)

  • 本地设备:
    1. ntb_mw_count(pidx) - 获取内存区域的数量,这些区域是可以用来分配本地设备和指定索引端口的对等设备之间的内存窗口。
    2. ntb_get_align(pidx, midx) - 获取限制共享内存区域对齐和大小的参数。然后就可以正确地分配内存。
    3. 根据第 2 步获取到的限制分配物理上连续的内存区域。
    4. ntb_mw_set_trans(pidx, midx) - 尝试为定义的对等设备设置指定索引的内存窗口的转换地址(如果不支持设置本地转换地址,此操作可能会失败)
    5. 使用便笺寄存器或消息寄存器等方式,将转换后的基址(通常与内存窗口索引一起)发送给对等设备。
  • 对等设备:
    1. ntb_peer_mw_set_trans(pidx, midx) - 尝试为指定内存窗口设置从其他设备(与 pidx 相关)接收到的转换地址。如果接收的地址超过了最大可能的地址或没有正确对齐,此操作可能会失败。
    2. ntb_peer_mw_get_addr(widx) - 获取 MMIO 地址以映射内存窗口,从而可以访问共享内存。

另外值得注意的是,方法 ntb_mw_count(pidx) 应该与对等方端口索引为 pidx 的 ntb_peer_mw_count() 返回相同的值。

NTB 传输客户端(ntb_transport)和 NTB 网络设备驱动(ntb_netdev)

NTB 的主要客户端是传输客户端,与 NTB 网络设备驱动配合使用。这些驱动一起工作,通过 NTB 创建一个到对等方的逻辑链路,以交换网络数据包。传输客户端建立到对等方的逻辑链接,并创建队列对来交换消息和数据。然后 NTB 网络设备驱动使用传输队列对创建一个以太网设备。网络数据在套接字缓冲区和传输队列对缓冲区之间复制。传输客户端除了用于网络设备驱动外,还可以用于其他用途,不过目前尚未编写其他应用程序。

NTB Ping Pong 测试客户端(ntb_pingpong)

Ping Pong 测试客户端可以演示如何使用 NTB 硬件的门铃寄存器和便笺寄存器,同时也是一个简单的 NTB 客户端示例。Ping Pong 在启动时启用链接,等待 NTB 链接建立后,开始读写 NTB 的门铃寄存器和便笺寄存器。对等方使用门铃寄存器的位掩码互相中断,每一轮将其向左移动一位,以测试多个门铃寄存器的位和中断向量的行为。Ping Pong 驱动程序还会在每一轮写对等方的门铃寄存器之前,读取本地的第一个便笺寄存器,将值加 1 后写入对等方的第一个便笺寄存器。

模块参数:

  • unsafe - 一些硬件在便笺寄存器和门铃寄存器上存在已知问题。默认情况下,Ping Pong 不会尝试操作此类硬件。您可以通过设置 unsafe=1 来覆盖此行为,但风险由您自己承担。
  • delay_ms - 指定接收门铃中断事件和为下一轮设置对等方的门铃寄存器之间的延迟。
  • init_db - 指定门铃寄存器的位以开始新的轮次。一旦所有门铃寄存器的位都被移出范围,一个新的轮次就开始了。
  • dyndbg - 建议在加载此模块时指定 dyndbg=+p,然后在控制台上观察调试输出。

NTB 工具测试客户端(ntb_tool)

工具测试客户端主要用于调试 NTB 硬件和驱动程序。该工具通过 debugfs 提供访问权限,用于读取、设置和清除 NTB 门铃寄存器,以及读写便笺寄存器。

该工具目前没有任何模块参数。

Debugfs 文件:

  • debugfs/ntb_tool/hw/

    将为工具探测到的每个NTB设备在 debugfs 中创建一个目录。以下将这个目录简称为 hw

  • hw/db

    该文件用于读取、设置和清除本地门铃寄存器。并非所有操作都被硬件支持。如果要读取门铃寄存器,可以读取该文件。如果要设置门铃寄存器,先写 s,再写要设置的值(例如:echo ‘s 0x0101’ > db)。如果要清除门铃寄存器,先写 c,再写要清除的位。

  • hw/mask

    该文件用于读取、设置和清除本地门铃寄存器掩码。详情见 db

  • hw/peer_db

    该文件用于读取、设置和清除对等方的门铃寄存器。详情见 db

  • hw/peer_mask

    该文件用于读取、设置和清除对等方的门铃寄存器掩码。详情见 db

  • hw/spad

    该文件用于读取和写入本地便笺寄存器。如果要读取所有便笺寄存器的值,可以读取该文件。如果要写入值,请写入一系列便笺寄存器编号和值组成的对(例如:echo ‘4 0x123 7 0xabc’ > spad # 分别设置 4 号便笺寄存器和 7 号便笺寄存器的值为 0x123 和 0xabc )。

  • hw/peer_spad

    该文件用于读取和写入对等方的便笺寄存器。详情见 spad

NTB MSI 测试客户端(ntb_msi_test)

MSI 测试客户端用于测试和调试 MSI 库,该库允许通过 NTB 内存窗口发送 MSI 中断。测试客户端通过 debugfs 文件系统进行交互:

  • debugfs/ntb_msi_test/hw/

    将为 msi 测试探测到的每个NTB设备在debugfs中创建一个目录。以下将这个目录简称为 hw

  • hw/port

    该文件描述了本地端口号。

  • hw/irq*_occurrences

    每个中断都有一个事件文件,读取时会返回触发中断的次数。

  • hw/peer*/port

    该文件描述了每个对等方的端口号。

  • hw/peer*/count

    该文件描述了每个对等方可以触发的中断数量

  • hw/peer*/trigger

    写入一个中断号(任何小于 count 中指定值的数字)将触发指定对等方上的中断。该对等方的中断事件文件应该递增。

NTB 硬件驱动

NTB 硬件驱动程序应使用 NTB 核心驱动程序注册设备。注册后,将调用客户端的探测和删除函数。

NTB Intel 硬件驱动(ntb_hw_intel)

Intel 硬件驱动程序支持在 Xeon 和 Atom CPU 上使用 NTB 。

模块参数:

  • b2b_mw_idx

    如果要通过内存窗口访问对等方的 NTB,则使用此内存窗口访问该对等方的 NTB。零或正值从第一个 mw idx 开始,负值从最后一个 mw idex 开始。双方必须在此处设置相同的值!默认值为 -1 。

  • b2b_mw_share

    如果要通过内存窗口访问对等方的 NTB,并且如果内存窗口足够大,则仍然允许客户端使用内存窗口的后半部分来向对等方进行地址转换。

  • xeon_b2b_usd_bar2_addr64

    如果在 Xeon 硬件上使用 B2B 拓扑,则在链路上游侧的 BAR2 窗口的 NTB 设备之间的总线上使用此 64 位地址。

  • xeon_b2b_usd_bar4_addr64 - 见 xeon_b2b_bar2_addr64

  • xeon_b2b_usd_bar4_addr32 - 见 xeon_b2b_bar2_addr64

  • xeon_b2b_usd_bar5_addr32 - 见 xeon_b2b_bar2_addr64

  • xeon_b2b_dsd_bar2_addr64 - 见 xeon_b2b_bar2_addr64

  • xeon_b2b_dsd_bar4_addr64 - 见 xeon_b2b_bar2_addr64

  • xeon_b2b_dsd_bar4_addr32 - 见 xeon_b2b_bar2_addr64

  • xeon_b2b_dsd_bar5_addr32 - 见 xeon_b2b_bar2_addr64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中position的属性有哪些,区别是什么

position有以下属性值&#xff1a; 属性值概述absolute生成绝对定位的元素&#xff0c;相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。relative生成相对定位的元素&#xff0c;相对于其原来的位置进行定位。元素的位置通过…

【深度学习实践】HaGRID,YOLOv5,手势识别项目,目标检测实践项目

文章目录 数据集介绍下载数据集将数据集转换为yolo绘制几张图片看看数据样子思考类别是否转换下载yolov5修改数据集样式以符合yolov5创建 dataset.yaml训练参数开始训练训练分析推理模型转换onnx重训一个yolov5s后记 数据集介绍 https://github.com/hukenovs/hagrid HaGRID&a…

Go语言与Rust哪一个更有发展前景?

Go语言和Rust都是目前非常受欢迎的编程语言&#xff0c;它们各自具有独特的优势和适用场景。关于哪一个更有发展前景&#xff0c;这实际上取决于多个因素&#xff0c;包括个人偏好、项目需求、社区支持以及未来技术的发展趋势等。 Go语言是由Google推出的&#xff0c;具有简洁…

户外大屏:六个必备的户外大屏推广工具助你脱颖而出-华媒舍

1. 大屏幕LED显示屏 大屏幕LED显示屏是一种常见而有效的户外推广工具。它采用LED背光源和高分辨率显示屏&#xff0c;能够在户外环境中展示鲜艳丰富的图像和视频内容。这种显示屏广泛应用于广场、商业街、体育场馆等公共场所&#xff0c;成为吸引人们目光的重要工具。 大屏幕…

使用route的reject拒绝境外ip通信

#以下是centos系统格式版&#xff0c;&#xff08;win不支持&#xff0c;搜本博&#xff0c;错误路由方式处理&#xff09; curl -# -O http://ftp.apnic.net/stats/apnic/legacy-apnic-latestcat legacy-apnic-latest | grep -v * | grep -v > 1.txtsed -i s/256/24…

蓝桥杯——数组切分

数组切分 题目分析 这里要搞清楚一个点就是满足区间内数字是连续数字的区间有什么样的特点&#xff0c;既然数字连续重新排列后的数字为n,n1,n2,n3,n4,…nlen&#xff0c;则最大数字和最小数字之差恰好是区间长度减1&#xff0c;即nlen-nlen&#xff0c;同样因为下标也是连续…

释机器学习中的召回率、精确率、准确率

精确率和召回率又被叫做查准率和查全率&#xff0c;可以通过P-R图进行表示 如何理解P-R(精确率-召回率)曲线呢&#xff1f;或者说这些曲线是根据什么变化呢&#xff1f; 以逻辑回归举例&#xff0c;其输出值是0-1之间的数字。因此&#xff0c;如果我们想要判断用户的好坏&…

MySQL的索引(优缺点,二叉树,红黑数,B+Tree)【详解】

1.什么是索引 索引&#xff1a;是用于提高查询数据性能的一种数据结构。实际开发中&#xff0c;对数据的读写操作大概是10&#xff1a;1 把索引理解为目录。 构建索引的过程&#xff0c;就是构建目录的过程 构建索引的过程中会对数据进行排序 2.索引的优缺点 优点&#x…

纳米体育数据足球数据接口:实时数据包接口文档API示例⑨

纳米体育数据的数据接口通过JSON拉流方式获取200多个国家的体育赛事实时数据或历史数据的编程接口&#xff0c;无请求次数限制&#xff0c;可按需购买&#xff0c;接口稳定高效&#xff1b;覆盖项目包括足球、篮球、网球、电子竞技、奥运等专题、数据内容。 纳米数据API2.0版本…

基于逻辑回归与决策树的地质灾害预测

大家好&#xff0c;我是带我去滑雪&#xff01; 地质灾害的预测对于人们的生命财产安全、社会稳定和经济发展具有重要意义。地质灾害如地震、泥石流、山体滑坡等往往会造成严重的人员伤亡和财产损失。大规模的地质灾害往往会导致社会秩序混乱、人员流动、灾民避难等问题&#x…

pip 和conda 更换镜像源介绍

1、前言 很多深度学习的项目免不了安装库文件、配置环境等等&#xff0c;如果利用官方提供的连接&#xff0c;网速很慢&#xff0c;而且很容易download掉。 所以配置好了虚拟环境&#xff0c;将pip换源属实重要 常见的国内镜像源有清华、中科大、阿里等等... 这里建议用中科…

前端面试——W3C标准及规范

W3C标准 1、万维网联盟标准不是某一个标准&#xff0c;而是一些列标准的集合。 简单来说可以分为结构、表现和行为 结构 主要是有HTML标签组成 表现 即指css样式表 行为 主要是有js、dom组成 web标准一般是将该三部分独立分开&#xff0c;使其更具有模块化。但一般产生行为时&…

Python yield from

yield from是Python生成器&#xff08;generator&#xff09;中的一个语法&#xff0c;用于简化生成器的操作。它可以使一个生成器委托部分操作给另一个生成器&#xff0c;从而简化代码。yield from在Python 3.3及更高版本中被引入。 在使用yield from之前&#xff0c;我们需要…

最少刷题数

最少刷题数 题目分析 对于每一名同学计算还需要再刷多少题才能保证刷题数比他多的人数不超过刷题数比他少的学生人数。我们可以考虑统计每一个分数的前缀和数组&#xff0c;sum[i]表示当前学生中&#xff0c;刷题数小于等于i的人数。那么对于学生i的刷题数a[i]&#xff0c;su…

GEE:Error: Unable to export features with null geometry. (Error code: 3)

在 Google Earth Engine&#xff08;GEE&#xff09;平台下载数据时&#xff0c;出现 Error: Unable to export features with null geometry. (Error code: 3)。这是因为你的要素数据没有图形参数。比如下面的代码&#xff0c;第一个参数是 null&#xff0c;就会报这个错。 e…

在亚马逊云EC2上启动PopOS

CloudEndure遇到的挑战 自从使用CloudEndure导入win11后就一发不可收拾,然后就可以尝试新的操作系统,比如system76的Pop!_OS,虽然上是基于ubuntu进行开发的,但是在使用安装CloudEndure 的时候还是遇到的了问题,可能是因为内核很新,也可能其他的一些原因. 如果说严格按照兼容性…

力扣977. 有序数组的平方

思路&#xff1a;暴力法&#xff1a;全部平方&#xff0c;然后调用排序API&#xff0c;排序算法最快是N*log(N)时间复制度。 双指针法&#xff1a;要利用好原本的数组本就是有序的数组这个条件&#xff0c; 只是有负数 导致平方后变大了&#xff0c;那么平方后的最大值就是在两…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后&#xff0c;面试官经常会追问一下你这个算法的时空复杂度是多少&#xff1f;&#xff08;好像作为一名算法工程师&#xff0c;我日常码代码的过程中&#xff0c;并没…

功能测试--APP专项测试

功能测试--APP专项测试 兼容性--云测平台模拟器兼容性怎么做安装卸载升级干扰测试推送规则--push推送服务器(是否按照规则去推送)手机端 用户体验 兼容性–云测平台模拟器 手机型号不同品牌商,不同机型(华为P30)操作系统版本:分辨率屏幕 1.尺寸:5.1. 5.5 4.7 2.类型: 刘海屏 水…

mineadmin 快速安装部署(docker环境)

前提条件&#xff1a;已安装docker 一、下载dnmp环境包 github地址&#xff1a;https://github.com/tomorrow-sky/dnmp gitee地址&#xff1a; https://gitee.com/chenjianchuan/dnmp 二、看一下dnmp包目录结构 三、打开docker-compose.yml 文件&#xff0c;将不需要…