如何为可缓存 PCIe BAR 进行 mmap

2023-11-27

我正在尝试编写一个自定义驱动程序mmap()PCIe BAR 的函数,目标是使该 BAR 可缓存在处理器缓存中。我知道这不是实现最高带宽的最佳方法,并且写入顺序是不可预测的(本例中也不是问题)。

这类似于中所描述的如何阻止 MMAP 缓存值?

处理器是Sandy Bridge i7,PCIe设备是Altera Stratix IV dev。木板。

首先,我尝试在 CentOS 5 (2.6.18) 上执行此操作。我更改了 MTRR 设置以确保 BAR 不在不可缓存的 MTRR 内并使用io_remap_pfn_range() with _PAGE_PCD and _PAGE_PWT位已清除。读取按预期工作:读取返回正确的值,并且第二次读取同一地址不一定会导致读取转到 PCIe(在 FPGA 中检查读取计数器)。然而,写入导致系统冻结,然后重新启动,日志或屏幕上没有任何消息。

其次,我尝试在具有 PAT 支持的 CentOS 6 (2.6.32) 上执行此操作。结果是相同的:读取工作正常,写入导致系统冻结并重新启动。有趣的是,非临时/写入组合的完整缓存行写入 (AVX/SSE) 按预期工作,即它们始终进入 FPGA,并且 FPGA 观察完整缓存行写入,然后读取返回正确的值。然而,简单的 64 位写入仍然会导致系统冻结/重启。

我也尝试过ioremap_cache()进而iowrite32()在驱动程序代码内。结果是一样的。

我认为这是一个硬件问题,但如果有人可以分享有关正在发生的事情的任何想法,我将不胜感激。

编辑:我能够在 CentOS 6 上捕获 MCE 消息:机器检查异常:5 Bank 5:be2000000003110a。

我还在 2 插槽 Sandy Bridge (Romley) 上尝试了相同的代码:读取和非临时写入行为是相同的,简单写入不会导致 MCE/崩溃,但对系统状态没有影响,即内存中的值不会改变。

另外,我在旧的 2 路 Nehalem 系统上尝试了相同的代码:简单的写入也会导致 MCE,尽管代码不同。


我不知道有任何 x86 硬件支持 MMIO 地址的 WriteBack (WB) 内存类型,并且您几乎肯定会看到这种不兼容的结果。 我已在我的博客上发表了对此主题的讨论:http://blogs.utexas.edu/jdm4372/2013/05/29/ and http://blogs.utexas.edu/jdm4372/2013/05/30/

在这些帖子中,我讨论了一种适用于某些处理器的方法 - 将 MMIO 范围映射两次 - 一次用于使用写入组合 (WC) 内存类型从处理器到 FPGA 的存储操作,一次用于从处理器读取使用写保护 (WP) 或直写 (WT) 类型写入 FPGA。当您写入“只写”区域中该行的别名时,您需要通过在“只读”区域中的缓存行上使用 CLFLUSH 来手动保持一致性。您还需要手动维护 FPGA 内存中值变化的一致性,因为 IO 设备无法为 MMIO 地址生成缓存失效事务。

几年前,当我在 AMD 工作时,我的团队就这样做了,现在正在尝试找出如何使用较新的 Linux 内核和 Intel 处理器来做到这一点。 Linux 不直接支持 WP 或 WT 内存类型及其预定义的映射函数,因此需要一些黑客攻击......覆盖某个区域的 MTRR 相当容易,但我在找到正确的位置时遇到了更多麻烦( s) 在 remap_pfn_range() 函数的后代中,我需要更改它,以便获取该范围的 PAT 条目中设置的 WP 或 WT 属性。

这种方法可能比其他(预定义的)类型的 IO 设备更适合 FPGA,因为 FPGA 的可编程性允许灵活地定义 PCI BAR 以在这种双映射模式下运行并与处理器配合。维持缓存一致性的侧驱动程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为可缓存 PCIe BAR 进行 mmap 的相关文章

  • 使 ASP.NET MVC 应用程序为 Web Farm 做好准备

    使 ASP NET MVC 应用程序 Web 场做好准备的最有效方法是什么 最重要的是共享当前用户的信息 上下文 和 不太重要 缓存的对象 例如查找项目 州 街道类型 县等 我听说过 读过 MemCache 但还没有看到关于如何实现和测试它
  • 如何缓存WKWebView加载的资源?

    I use WKWebView显示包括图像在内的富文本 我想将这些图像缓存在磁盘上 如何获取这些 HTTP 请求并缓存响应 默认设置对 WKWebView 中加载的所有资源进行缓存 您所要做的就是在 HTTP 响应中为这些资源设置正确的标头
  • 从 Django 缓存中删除特定项目?

    我正在使用站点范围的缓存内存缓存 http en wikipedia org wiki Memcached作为后端 当底层数据库对象更改时 我想使缓存中的页面无效 如果页面名称发生更改 那么我将使整个缓存无效 因为它会影响每个页面上的导航
  • Ehcache 2.1是否支持Hibernate 3.3.2GA中的事务缓存并发策略?

    Does 以太网缓存2 1 http dsoguy blogspot com 2010 04 ehcache 21 beta lots of stuff still html现在支持事务缓存并发策略 http docs jboss org
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • 将 numpy memmap 刷新到 npy 文件

    有没有一种方法可以将 numpy memmap 数组保存到 npy文件 显然 有一种方法可以从 a 加载这样的数组 npy文件如下 data numpy load input npy mmap mode r 但刷新文件并不等同于将其存储在
  • 即使禁用缓存,Safari 也会缓存 GET 请求

    我已经将我所知道的所有标头设置为在我的服务器上禁用缓存 甚至禁用 ETAG 但 Safari 仍然偶尔 大约 50 次 缓存我的请求 Workflow 我正在实施 oauth 1 所以 浏览器使GET api user request 服务
  • 易失性限定符是否会取消该内存的缓存?

    在本文中 http www drdobbs com parallel 易失性 vs 易失性 212701484 pgno 2 http www drdobbs com parallel volatile vs volatile 212701
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca
  • 如何访问模板缓存? - 姜戈

    I am 缓存 HTML在几个模板内 例如 cache 900 stats stats endcache 我可以使用以下方式访问缓存吗低级图书馆 例如 html cache get stats 我确实需要对模板缓存进行一些细粒度的控制 有任
  • HTML5 应用程序缓存与浏览器缓存

    当前浏览器中实现了 applicationCache 我的应用程序缓存清单文件更改版本号 然后触发 applicationCache 更新事件 强制浏览器从服务器下载清单文件中提到的新资源 假设我已经在这些资源上配置了远期到期标头 这些文件
  • 如何在 Vaadin 中禁用浏览器缓存

    我的问题很短 希望很容易解决 我怎样才能完全禁用我的浏览器缓存用vaadin实现的webservice 我想完全禁用缓存 因为当我尝试进行一些 PDF 流式传输并在浏览器中显示它们时遇到问题 我已经阅读了有关我的问题的解决方案 例如这里 使
  • 当我计划高效缓存多个值时,应该如何实现 Guava 缓存?

    我有一个带有 Guava 的 Java 类LoadingCache
  • Rails 4.0 expire_fragment/缓存过期不起作用

    我一直在尝试使用 Rails 的缓存功能 但我无法使某些缓存片段过期 尽管它们似乎已过期 使用 Rails 教程网站中指出的 Russian Doll Caching 我正在使用此配置 我使release controller rb 控制器
  • GitHub Actions:如何缓存测试容器的 Docker 映像?

    我使用 Testcontainers 在 GitHub Actions 中执行一些测试 Testcontainers 提取我的测试中使用的图像 不幸的是 每次构建时都会再次提取图像 如何在 GitHub Actions 中缓存图像 GitH
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • F# 正确使用序列缓存

    我正在尝试将 Seq cache 与我制作的函数一起使用 该函数返回最多为 N 的素数序列 不包括数字 1 我无法弄清楚如何将缓存的序列保留在范围内 但仍然使用它在我的定义中 let rec primesNot1 n 2 n gt Seq
  • 如何在 Laravel 5 中通过键获取所有缓存项的列表?

    Laravel 中的 Cache 类具有 get itemKey 等方法来从缓存中检索项目 以及 Remember itemKey myData1 myData2 来将项目保存在缓存中 还有一个方法可以检查缓存中是否存在某个项目 Cache
  • docker build --no-cache 是否构建不同的层?

    几个月前 我决定使用以下命令设置我的项目构建 docker 镜像的 CIno cacheflag 我认为最好不要冒险让 docker 使用旧的缓存层 我现在才意识到 我的图像各层的 sha 总是不同的 即使新构建的图像应该生成与之前构建的相
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行

随机推荐