【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

相关文章

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何将文件内容转换为MD5哈希值

《Java如何将文件内容转换为MD5哈希值》:本文主要介绍Java如何将文件内容转换为MD5哈希值的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java文件内容转换为MD5哈希值一个完整的Java示例代码代码解释注意事项总结Java文件内容转换为MD5

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基