PCIe 总线上的写入是原子的吗?

2023-11-30

我是 PCIe 的新手,所以这可能是一个愚蠢的问题。这似乎是询问有关 PCIe 接口的相当基本的信息,但我无法找到答案,因此我猜测我缺少一些使答案显而易见的信息。

我有一个系统,其中有一个 ARM 处理器(主机)通过 PCIe(设备)与 Xilinx SoC 进行通信。 SoC 内的端点也是 ARM 处理器。

Drawing showing a Xilinx SoC logically containing two blocks: FPGA Logic and ARM Processor. Each block is connected to a PCIe bus which is then leaves the SoC and connects to an external ARM processor acting as the PCIe host

外部 ARM 处理器(主机)将通过 PCIe 写入 SoC ARM 处理器(设备)的寄存器空间。这将命令 SoC 执行各种操作。该寄存器空间对于 SoC(设备)来说是只读的。外部 ARM 处理器(主机)将写入该寄存器空间,然后发出中断信号,向 SoC 指示新参数已写入并且应该对其进行处理。

我的问题是:外部 ARM(主机)进行的写入相对于 SoC(设备)的读取来说是否保证是原子的?在传统的共享内存情况下,对单个字节的写入保证是原子操作(即,您永远不会遇到这样的情况:读取器已读取该字节的前 2 位,但在读取最后 6 位之前作者用新值替换它们,导致垃圾数据)。 PCIe 也是这样吗?如果是这样,原子性的“单位”是什么?单个事务中的所有字节相对于整个事务都是原子的,还是每个字节仅相对于其自身而言是原子的?

这个问题有意义吗?

基本上我想知道在我的情况下内存保护在多大程度上是必要的。如果可能的话,我希望避免锁定内存区域,因为两个处理器都运行 RTOS,并且避免内存锁将使设计更简单。


所以在原子性问题上,PCIe 3.0规范(我只有一个)被提到了几次。

首先你有第 6.5 节 锁定交易这可能不是您所需要的,但无论如何我想记录下来。基本上,这是您之前描述的最坏的情况。

需要锁定事务支持来防止使用遗留软件的系统中出现死锁 这会导致对 I/O 设备的访问

但无论如何,您都需要正确检查它的使用情况,正如它所指出的那样。

如果与锁定序列相关的任何读取未成功完成,请求者必须 假设锁的原子性不再得到保证,并且锁之间的路径 请求者和完成者不再被锁定

照这样说第 6.15 节 原子操作 (AtomicOps)更像是您感兴趣的内容。您可以使用 AtomicOps 指令执行 3 种类型的操作。

FetchAdd(获取和添加):请求包含单个操作数,即“添加”值

交换(无条件交换):请求包含单个操作数,即“交换”值

CAS(比较和交换):请求包含两个操作数,一个“比较”值和一个“交换”值

Reading 第6.15.1节我们看到提到这些指令主要是在单个总线上存在多个生产者/消费者的情况下实现的。

AtomicOps 支持高级同步机制,当存在以下情况时特别有用: 需要以非阻塞方式同步的多个生产者和/或多个消费者。例如,多个生产者可以安全地排队到一个公共队列,而无需任何显式锁定。

搜索规范的其余部分,我发现除了与这些 AtomicOps 相关的部分之外,几乎没有提到原子性。对我来说,这意味着规范仅在使用这些操作时确保此类行为,但是实现此操作的上下文表明,只有当存在多生产者/消费者环境(而您的环境显然不存在)时,他们才会出现此类问题。

The last place I would suggest looking to answer your question is Section 2.4 Transaction Ordering To note I am fairly sure the idea of transactions "passing" others only makes sense with switches in the middle as these switches can make such decisions, once your put bits on the bus in your case there is no going back. So this likely only applies if you place a switch in there. enter image description here

您关心的是写入是否可以绕过读取。写的是发布的,读的是非发布的。

A3, A4 A Posted Request must be able to pass Non-Posted Requests to avoid deadlocks.

所以一般来说允许写绕过读以避免死锁。

考虑到这一点,我认为写入不可能绕过系统上的读取,因为总线上没有设备可以执行此事务重新排序。由于您有 RTOS,我非常怀疑它们正在查询 PCIe 事务并在发送之前对它们重新排序,尽管我个人还没有对此进行过研究。

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

PCIe 总线上的写入是原子的吗? 的相关文章

  • 多处理中的共享内存

    我有三个大清单 第一个包含位数组 模块位数组 0 8 0 另外两个包含整数数组 l1 bitarray 1 bitarray 2 bitarray n l2 array 1 array 2 array n l3 array 1 array
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • CPU Relax 指令和 C++11 原语

    我注意到许多使用特定于操作系统的原语实现的无锁算法 例如所描述的自旋锁here http locklessinc com articles locks 使用 Linux 特定的原子原语 经常使用 cpurelax 指令 使用 GCC 可以通
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 为什么 std::atomic 对象不可复制?

    看起来std atomic类型不可复制构造或复制分配 为什么 是否有技术原因导致无法复制原子类型 或者是故意限制接口以避免某种不良代码 在没有原子指令 或没有所有整数大小的原子指令 的平台上 类型可能需要包含互斥体以提供原子性 互斥锁通常不
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • 在LPC2148 ARM处理器上创建中断向量的汇编代码

    我最近刚刚开始使用 LPC2148 ARM 处理器 我试图理解一些有关创建中断向量的汇编代码 这是代码 Runtime Interrupt Vectors Vectors b start reset start ldr pc undf un
  • 原子变量能保证内存可见性吗?

    关于内存可见性的小问题 代码示例1 class CustomLock private boolean locked false public boolean lock if locked locked true return true re
  • 2022年Android CPU架构分布(armeabi-v7a vs arm64-v8a)

    有没有关于 2022 年 Android 设备上的架构使用情况的官方信息 我有一个支持armeabi v7a 和arm64 v8a 的应用程序 我想要放弃对armeabi v7a的支持并且仅支持 64 位设备 arm64 v8a 但我找不到
  • 在 Python 中共享多处理内存的更好方法?

    我已经解决这个问题一周了 它变得非常令人沮丧 因为每次我实现一个更简单但相似规模的示例来说明我需要做的事情时 事实证明多重处理都会把它搞砸 它处理共享内存的方式让我感到困惑 因为它非常有限 很快就会变得无用 所以我的问题的基本描述是 我需要
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected

随机推荐

  • ES6 javascript类继承,为什么我们需要从派生类调用super()

    在 javascript ES6 中 在继承中 如果派生类有构造函数 为什么必须从派生构造函数调用 super 一些失败的例子是 带有构造函数的基类 但派生类不调用超级类 class Base constructor class Deriv
  • 如何让Xcode 3.2.3构建特定的架构?

    包含静态库时出现以下错误 缺少所需的架构 i386 文件 这在 30 秒前有效 只有当我升级到 Xcode 3 2 3 时才失败 我使用 file 命令进行检查 是的 XCode 正在构建完全错误的架构 armv6 armv7 而 不是 i
  • 如何在 NopCommerce 中实施操作过滤器

    我想更改 CheckoutController 中 OpcSaveBilling 操作的操作中的一些代码 我不想改变 NopCommerce 的核心代码 所以我需要尝试用我自己的自定义代码覆盖代码 我阅读了这篇文章以开始使用http www
  • 生成签名 APK 错误:将字节码转换为 dex 时出错以及另外 1 个错误

    当我清理 重建我的项目甚至运行应用程序时 它不会返回任何错误 但是当我生成签名的 APK 时 它返回两个错误 Error Error converting bytecode to dex Cause com android dex DexE
  • 使用 Start-Job 时本地函数调用不起作用

    function F2 String var2 function F1 String var1 F2 var2 while i le count F1 dir i Start Job ScriptBlock function F1
  • 使用 hibernate 4.0 和 spring 3.1.0.release 的事件监听器?

    这些 jar 都是新发布的 并且具有 Java EE 应用程序的最新解决方案 但我在 hibernate cfg xml 中指定 hibernate 侦听器时遇到问题 在 Spring 3 1 0 之前 LocalSessionFactro
  • 如何在 JavaScript 循环中添加延迟?

    我想在 a 中添加延迟 睡眠while loop 我尝试过这样的 alert hi for var start 1 start lt 10 start setTimeout function alert hello 3000 只有第一种情况
  • 如何计算最佳批量大小?

    有时我会遇到一个问题 OOM when allocating tensor with shape e g OOM when allocating tensor with shape 1024 100 160 其中 1024 是我的批量大小
  • 如何在 Windows 上以提升的权限运行脚本

    我正在编写一个需要执行管理任务的 pyqt 应用程序 我更愿意以提升权限来启动我的脚本 我知道这个问题在 SO 或其他论坛中被多次提出 但人们建议的解决方案是看看这个SO问题从 Python 脚本中请求 UAC 提升 但是 我无法执行链接中
  • 通过扩展实现协议[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个协议来包装使用 UIImagePickerController 的过程 以使其在我的应用程序中更加精简 我基本上有这样的东西 public protocol MediaAccessor UIIm
  • CMake 未链接 Python

    抱歉 如果我重复一个问题 但我只是无法在互联网上的任何地方找到我正在寻找的解决方案 但我相信这是一个非常简单的问题 我正在尝试使用一些自定义 C 库扩展 python 并使用 CMake 构建我的 C 库 我正在按照以下说明进行操作http
  • 无法在 Opencv2 上导入 cv

    我使用的是 Windows 10 机器 并安装了 Python numpy 和 OpenCV官方链接使用预构建的二进制文件 我可以成功导入 numpy 和 cv2 但当我尝试导入 cv 时出现错误 import cv2 import num
  • 不同终端的不同 nCurses 行为

    我使用不同的终端获得两种不同的行为 这是我的代码 use ncurses initscr curs set 0 noecho start color define win newwin 20 50 1 1 wclear win box wi
  • 如何解决 Capybara::ElementNotFound 错误

    我遇到了以下问题 这是我第一次使用水豚 你知道我如何解决这个问题吗 谢谢 我使用 Rails 3 0 0 和以下 gem gem rails 3 0 0 gem capybara gem database cleaner gem cucum
  • 整数到字符串在综合中出错(宽度不匹配)

    我正在尝试将整数转换为字符串 使用integer image val 并将其填充或限制为特定长度 我已经制作了这个函数 当我使用时它可以很好地完成工作report陈述并模拟 function integer2string pad val i
  • 如何以编程方式拒绝来电android

    android 是否可以通过代码拒绝来电 请帮助我已经完成了一些教程 但它们对我不起作用 是的 伙计 可以尝试这个http androidsourcecode blogspot in 2010 10 blocking incoming ca
  • 德国引号在tinytex/rmarkdown 中被破坏 - 即使使用包“csquotes”

    我想要的是 我想通过 MacOS Catalina 上的 rmarkdown 和tinytex 在我的 TeX PDF 中添加德语引号 参见示例 问题 它曾经按照指导方针工作如此处提议的 但现在 它不再起作用了 我只得到英文引号 但是not
  • CSS中伪元素前的“&”是什么意思?

    以下 CSS 取自推特引导程序与号 字符的含义是什么 clearfix zoom 1 before after display table content after clear both That s LESS 而不是 CSS 此语法允许
  • 会话变量未从 http://www.xxxx.com 转移到 http://xxxx.com

    我网站上的一些用户让我意识到了这个问题 许多用户进入他们的浏览器http xxxx com然后登录 然后他们可能会点击一个链接 将他们带到http www xxxx com它要求他们再次登录 这是以前有人遇到过的已知问题吗 我尝试用谷歌搜索
  • PCIe 总线上的写入是原子的吗?

    我是 PCIe 的新手 所以这可能是一个愚蠢的问题 这似乎是询问有关 PCIe 接口的相当基本的信息 但我无法找到答案 因此我猜测我缺少一些使答案显而易见的信息 我有一个系统 其中有一个 ARM 处理器 主机 通过 PCIe 设备 与 Xi