是否在PCIe总线原子上写?

问题描述 投票:0回答:1

我是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指示已写入新参数,并应对其进行处理。

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

这个问题有意义吗?

基本上,我想知道在我的情况下需要多大程度的内存保护。如果有可能,我想避免在两个处理器都运行RTOS时锁定内存区域,避免内存锁定会使设计更简单。

arm shared-memory atomic atomicity pci-e
1个回答
0
投票

因此,在原子性问题上,多次提到了PCIe 3.0规范(我只有一个)。

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

需要锁定交易支持,以防止使用旧版软件的系统出现死锁导致对I / O设备的访问

但是您仍然需要注意使用它,因为它指出了。

如果与锁定序列相关的任何读取未成功完成,则请求者必须假设不再确保锁的原子性,并且请求者和完成者不再处于锁定状态

具有上述内容[<6.15节AtomicOps(AtomicOps)与您感兴趣的内容非常相似。AtomicOps指令可以执行3种类型的操作。

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

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

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

阅读

6.15.1节

我们看到提到,这些指令主要用于单个总线上存在多个生产者/消费者的情况。
AtomicOps启用高级同步机制,当存在以下情况时特别有用需要以非阻塞方式同步的多个生产者和/或多个消费者。例如,多个生产者可以安全地加入一个公共队列,而无需任何显式锁定。

搜索本规范的其余部分,在与这些AtomicOps有关的部分之外,我几乎没有提及原子性。对我而言,这意味着该规范仅在使用这些操作时才确保此类行为,但是围绕实现此目的的上下文表明,它们仅在存在多生产者/消费者环境的情况下才期待此类问题,而您显然没有。

我建议回答您问题的最后一个地方是

2.4节交易排序

要注意的是,我很确定交易“通过”其他交易的想法只对中间的交易有意义,因为这些交易可以使交易实现决定,一旦您将总线放在位,就再也没有回头路了。因此,这可能仅在您在其中放置开关的情况下适用。enter image description here您所关心的是写入可以绕过读取。写被发布,读不被发布。

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

因此通常允许写入绕过读取以避免死锁。

由于引起了这种担忧,我不认为写操作有可能绕过系统上的读操作,因为总线上没有设备可以进行事务重新排序。由于您有RTOS,因此我非常怀疑它们会在发送前对PCIe事务进行排序并重新排序,尽管我个人没有对此进行调查。

© www.soinside.com 2019 - 2024. All rights reserved.