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 总线上的写入是原子的吗? 的相关文章

  • 将结构体偏移属性赋予汇编器

    如何将 C 结构体的偏移量发送到汇编代码 例如 在我的 C 代码中 typedef struct unsigned int a unsigned int b CMyStruct 我向 ASM 函数发送一个 CMyStruct 结构的指针 假
  • 使用 mmap 访问 PCI-e 内存空间

    我在 Freescale MPC8308 处理器 基于 PowerPC 架构 上使用 PCI e 端口 在尝试使用它时遇到一些问题 端点 PCI e 设备的内存空间等于 256 MB 我可以使用 pciutils 包轻松读取和写入端点设备的
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • 在 x86-64 上,“movnti”指令是原子指令吗?

    在 x86 64 CPU Intel 或 AMD 上 将 4 8 字节写入 32 64 位对齐地址的 movnti 指令是原子的吗 Yes movnti在自然对齐的地址上是原子的 就像 x86 上所有其他自然对齐的 8 16 32 64b
  • 为什么在这种无竞争的情况下原子比锁慢得多?

    我使用原子而不是锁编写了一些东西 并且对它在我的情况下慢得多感到困惑 我编写了以下小型测试 include
  • 将 GCC 内联汇编与采用立即值的指令结合使用

    问题 我正在为 ARM Cortex M3 处理器开发定制操作系统 为了与我的内核交互 用户线程必须生成 SuperVisor Call SVC 指令 以前称为 SWI 用于软件中断 该指令在ARM ARM中的定义是 这意味着该指令需要即时
  • 使用 Thrift 通过共享内存进行 IPC 通信

    我找不到关于如何使用 apache thrift 通过共享内存进行 ipc 通信的足够示例 我的目标是在 thrift 的帮助下序列化现有的类 然后通过共享内存发送到另一个进程 在该进程中我在 thrift 的帮助下再次反序列化它 现在我正
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • OMP_NUM_THREADS=1 时 #pragma ompatomic 的性能问题

    我观察到我正在编写的 openmp 代码出现了意外的 对我来说 行为 代码结构如下 pragma omp parallel for for int i 0 i
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • AtomicReference.compareAndSet() 使用什么来确定?

    假设你有以下课程 public class AccessStatistics private final int noPages noErrors public AccessStatistics int noPages int noErro
  • 如何保证成员4字节对齐?

    为了使用 OSAtomicDecrement mac 特定的原子操作 我需要提供一个 4 字节对齐的 SInt32 这样的煮法有用吗 还有其他方法可以解决对齐问题吗 struct SomeClass SomeClass member sto
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • 如何使用 Neon SIMD 将无符号字符转换为有符号整数

    如何转换变量的数据类型uint8 t to int32 t使用霓虹灯 我找不到执行此操作的任何内在因素 假设您想要将 16 x 8 位整数的向量转换为 4 个 4 x 32 位整数的向量 您可以通过首先解压缩为 16 位 然后再次解压缩为
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

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

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • CPU Relax 指令和 C++11 原语

    我注意到许多使用特定于操作系统的原语实现的无锁算法 例如所描述的自旋锁here http locklessinc com articles locks 使用 Linux 特定的原子原语 经常使用 cpurelax 指令 使用 GCC 可以通
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE

随机推荐

  • 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