NTB EEPROM设置与跨节点数据传输

2024-03-23 05:10

本文主要是介绍NTB EEPROM设置与跨节点数据传输,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NTB EEPROM设置与跨节点数据传输


双控双活系统中除了需要监测系统状态的心跳之外,还需要能够跨节点传输数据的通道。PCIE非透明桥(NTB)由于其基于标准的PCIE规范,软件依赖少,速度快,配置简便,受到许多人的青睐。基于PCIE NTB进行跨节点数据传输的原理很简单,如下图所示意:

wKioL1bisMvSjHKnAADVgqof8MQ879.jpg


较之于普通的PCIE/PCI设备的配置空间寄存器,NTB上多了bar2/3,bar4/bar5的地址转换寄存器,本地节点发送过来的命中bar2/bar3或者bar4/bar5的TLP的地址高位会转换成相应的地址转换寄存器里的值,然后转发到对方节点。



在本人最近的一次NTB调试过程中,发现数据能从link port端写到virtual port一侧指定的内存地址中去,并且virtual port这侧能从指定的地址读回link port端写回的数据;但是类似的程序交换在virtual port端和link port端上执行时,发现virtual port端能把数据写到link port端,并且从link port端读回的数据和之前写的数据一致,但是link port端却无法从指定的地址读回期望的数据。


为了分析这一问题,笔者首先用GDB跟踪了代码,没有发现程序逻辑上的问题;然后把两端的程序统一到一个文件中,用不同的输入参数控制是做远程读写还是本地读写,重新测试,还是能够看到同样的现象。正在百思不得其解的时候,突然想起了地址转换的原理,脑海里浮现出地址转换的过程:

首先,判断NT接受到的TLP的地址是否命中它对应的Bar,在我所使用的实际例子当中,实际用到了Bar3/Bar2组成的一个64 bit的基地址。检查之后,确定CPU是往这一地址访问数据;

接着,检查地址转换寄存器里的值是否是期望的值。正确的值应该是跨节点要访问的内存在所在它所在节点的总线地址,在intel x86的体系结构当中,这个总线地址就是内存的物理地址。检查这个寄存器的值也没问题,如下它的值是:0x0d6d80007800003

[root@localhost bin]#  lspci -xxxxx -s 06:00.0 | grep "c30"

c30: 00 00 00 00 0b 00 01 b7 03 00 80 07 00 00 80 6d

[root@localhost bin]#  lspci -xxxxx -s 06:00.0 | grep "c40"

c40:0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00


既然基地址寄存器和地址转换寄存器都没有问题,那问题到底在哪里呢?Request ID的值也设置过,也没有问题。到底问题出在哪呢?


正在百思不得其解的时候,想起来了地址转换寄存器的高位的位段长短也是由setup寄存器设置的,setup寄存器最高为直到从高到低位出现的第一个不为1的bit作为mask,后面的bit全为0,与地址转换寄存器中的值进行与就得到转换后的地址高位。


根据上面的转换方式,发现在virtual port这一侧,Bar3/Bar2的setup寄存器是0xfffffffe00000000,因此转换后的地址是:

0xfffffffe00000000 & 0x0d6d80007800003 = 0x0d6d800000000000。实际我使用的地址窗口只有2M,因此期望转换后地址的高位应是:0x0d6d80007800000。这就难怪为什么总感觉数据能写道对方节点去,但在对方期望的地址总是读不会指望的数据。因此setup的寄存器必须改成:0xffffffffffe000000。按照上面的设置,利用下面命令重新设置下寄存器的值: 

[root@localhost bin]# setpci -s 06:00.0 d8.l=0xffffffff

接着进行测试,完全通过。继续分析为何setup寄存器出现问题,原来它的值是由NTB EEPROM初始化的,在我维护的EEPROM固件的一个中间颁布中出现问题导致f变成了e。


这次给我的教训就是一定要深刻理解NTB数据传输的原理,只有对它进行地址转换的过程和相关寄存器了然于胸,才能刨根到底。
















本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1750055 ,如需转载请自行联系原作者



这篇关于NTB EEPROM设置与跨节点数据传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/837234

相关文章

JAVA Calendar设置上个月时,日期不存在或错误提示问题及解决

《JAVACalendar设置上个月时,日期不存在或错误提示问题及解决》在使用Java的Calendar类设置上个月的日期时,如果遇到不存在的日期(如4月31日),默认会自动调整到下个月的相应日期(... 目录Java Calendar设置上个月时,日期不存在或错误提示java进行日期计算时如果出现不存在的

Java利用Spire.XLS for Java自动化设置Excel的文档属性

《Java利用Spire.XLSforJava自动化设置Excel的文档属性》一个专业的Excel文件,其文档属性往往能大大提升文件的可管理性和可检索性,下面我们就来看看Java如何使用Spire... 目录Spire.XLS for Java 库介绍与安装Java 设置内置的 Excel 文档属性Java

idea设置快捷键风格方式

《idea设置快捷键风格方式》在IntelliJIDEA中设置快捷键风格,打开IDEA,进入设置页面,选择Keymap,从Keymaps下拉列表中选择或复制想要的快捷键风格,点击Apply和OK即可使... 目录idea设www.chinasem.cn置快捷键风格按照以下步骤进行总结idea设置快捷键pyth

MyBatis配置文件中最常用的设置

《MyBatis配置文件中最常用的设置》文章主要介绍了MyBatis配置的优化方法,包括引用外部的properties配置文件、配置外置以实现环境解耦、配置文件中最常用的6个核心设置以及三种常用的Ma... 目录MyBATis配置优化mybatis的配置中引用外部的propertis配置文件⚠️ 注意事项X

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

C#借助Spire.XLS for .NET实现Excel工作表自动化样式设置

《C#借助Spire.XLSfor.NET实现Excel工作表自动化样式设置》作为C#开发者,我们经常需要处理Excel文件,本文将深入探讨如何利用C#代码,借助强大的Spire.XLSfor.N... 目录为什么需要自动化工作表样式使用 Spire.XLS for .NET 实现工作表整体样式设置样式配置

Java实现为PDF设置背景色和背景图片

《Java实现为PDF设置背景色和背景图片》在日常的文档处理中,PDF格式因其稳定性和跨平台兼容性而广受欢迎,本文将深入探讨如何利用Spire.PDFforJava库,以简洁高效的方式为你的PDF文档... 目录库介绍与安装步骤Java 给 PDF 设置背景颜色Java 给 PDF 设置背景图片总结在日常的

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

Java利用Spire.XLS for Java设置Excel表格边框

《Java利用Spire.XLSforJava设置Excel表格边框》在日常的业务报表和数据处理中,Excel表格的美观性和可读性至关重要,本文将深入探讨如何利用Spire.XLSforJava库... 目录Spire.XLS for Java 简介与安装Maven 依赖配置手动安装 JAR 包核心API介