【70】NTB的地址映射和地址转换

2024-03-23 05:10

本文主要是介绍【70】NTB的地址映射和地址转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  NTB有两个重要的应用
  (1)PCI于隔离,即可以隔离出两个或者多个PCI系统
  (2)实现地址翻译。
  这篇文章注重说一下地址翻译,关于NTB一些介绍和应用见:
https://blog.csdn.net/linjiasen/article/details/104532342
https://mp.weixin.qq.com/s/0Ais2S-GnFfsWRnoWhjRzw
https://mp.weixin.qq.com/s/-AAxGslLt0nZkVCn3KWI7Q
https://mp.weixin.qq.com/s/VBRDnpJG5EmI8O2Ple1Xeg
  下图就是用PCIe switch NTB+DMA组建的NTB back to back的框图
在这里插入图片描述
  对于NTB的来说,可以做地址映射的BAR0、BAR1、BAR2/3、BAR4/5(看芯片设计到底用哪些BAR做reg映射,哪些BAR做address映射)在Primary端(virtual端)和Secondary端(link端)各有3个寄存器(有些芯片是2个寄存器,其实BAR CTRL和BAR LMT可以合成一个reg,没有道理说你弄一个很大的BAR,只开一个小的窗口,不用也是浪费)
  (1)BAR CTRL reg决定了BAR SIZE。和base address reg共同组成NTB BARx的memory窗口。
  (2)BAR LMT reg决定了NTB的转发窗口,一般转发窗口和大小和BAR SIZE一样大。
  (3)BAR XLAT reg决定往对端映射时的起始地址。
  这样DMA或者CPU写NTB BARx对应的offset,就会被NTB转发到对控映射的起始地址+offset的位置,这样就构成了一个简单存储系统的镜像模型了。当然实际工程中存储的镜像远比这个复杂,不过原理是一样的,只是有很多可靠性的问题需要解决。
在这里插入图片描述
  举个例子吧,我使用的单NTB系统,即一控提供NTB,一控提供TB,为了方便区分,提供NTB的我们叫主控,提供TB的我们叫从控。逻辑上主控的CPU只能枚举到NTB primary端,NTB的secondary端是从控的CPU枚举的(单NT在实际产品中有很多问题,因为需要主控起来了,从控再启动,这样从控才能枚举到NTB secondary端,或者自己写driver来枚举NTB 设备)
NTB PRI的NTB BAR的地址如下:
Region 0: Memory at dce00000 (32-bit, non-prefetchable) [size=32K]
Region 1: Memory at dcd00000 (32-bit, non-prefetchable) [size=1M]
Region 2: Memory at 1be00000000 (64-bit, prefetchable) [size=4G]
Region 4: Memory at 1bc00000000 (64-bit, prefetchable) [size=8G]
我把primary端NTB BAR23(1be00000000~1be00000000+4G-1)映射到从控的0x5cd00000这个地址(下图的XLAT23),这地址其实是NTB SEC端的NTB BAR0(dcd00000)减2G的位置。也就是说我们把primary端的NTB BAR23映射到secondary端的BAR0-2G的位置(这个地址可以随意改)。 这样映射完毕后,主端NTB BAR23就映射到从控NTB BAR0减2G的位置了。
NTB SEC的NTB BAR的地址如下:
Region 0: Memory at dcd00000 (32-bit, non-prefetchable) [size=32K]
Region 1: Memory at dcc00000 (32-bit, non-prefetchable) [size=1M]
Region 2: Memory at fc00000000 (64-bit, prefetchable) [size=4G]
Region 4: Memory at fa00000000 (64-bit, prefetchable) [size=8G]
在这里插入图片描述
注意关闭IOMMU功能,目前linux 中对于AMD和intel的IOMMU的支持都有点问题,开了IOMMU访问NTB是有问题的。
在这里插入图片描述
这里为啥0x438寄出器的值修改成0x123456后读取出来是0x123000呢,是因为这个reg的低12bit是RO的,默认值就是0.
在这里插入图片描述
  上面主从控的值是对应的,也证明我们成功把主端NTB BAR23映射到从控NTB BAR0减2G的位置了。
  NTB的地址转换其实就是这么简单,你可以把对控任何一个地址映射过来,只要这个地址是可以访问的。如果是X86系统下,其实最简单的方式是把对控的0地址映射过来测试一下NTB是否正常,因为X86前面的4K的地址是reserved,是可以正常读写的。
在这里插入图片描述
  如果对控的地址是host的main memory地址,你去对控用busybox devmem访问main memory则需要hack系统把限制访问给拿掉。hack系统有两种方法,一种是你写个ko把busybox devmem在内核态的那个限制给override掉,一种是重新编译内核把限制给拿掉
hack系统的方法https://blog.csdn.net/linjiasen/article/details/103408631?ops_request_misc=&request_id=91b4390998ce4875a5daa6a57a380fce&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2blogkoosearch~default-1-103408631-null-null.268v1control&utm_term=%E6%89%80%E6%9C%89%E7%9A%84&spm=1018.2226.3001.4450
如果NTB转到对控的的地址是个MMIO,则需要用setpci -s bus:dev.fun 0x4=0x7把对应设备的memory access enable给打开

  你可以通过NTB访问对控任意你映射的地址,如果做过工程,你就会懂得这句话杀伤力有多大了。NTB可以映射任何一个地址,是典型性的双刃剑,DMA+NTB的形式就可以访问对控的任何地址,用的好的话可以实现很多需求,用的不好,可能把对控搞死,比如踩内存啥的,由于是对控DMA发起的,到时候非常难定位。

这篇关于【70】NTB的地址映射和地址转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

Exchange 服务器地址列表的配置方法与注意事项

Exchange Server 是微软推出的一款企业级邮件服务器软件,广泛应用于企业内部邮件系统的搭建与管理。配置 Exchange 服务器地址列表是其中一个关键环节。本文将详细介绍 Exchange 服务器地址列表的配置方法与注意事项,帮助系统管理员顺利完成这一任务。 内容目录 1. 引言 2. 准备工作 3. 配置地址列表 3.1 创建地址列表 3.2 使用 Exchange

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

匹配电子邮件地址的正则表达式

这个正则表达式 QRegularExpression regex(R"((\w+)(\.|_)?(\w+)@(\w+)(\.(\w+))+))"); 用于匹配电子邮件地址的格式。下面是对这个正则表达式的逐步解析和解释: 1. QRegularExpression 构造函数 QRegularExpression regex(R"((\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+