【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

相关文章

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre