ARM strex和ldrex中的原子操作 - 它们可以在I / O寄存器上工作吗?

时间:2013-04-14 03:06:27

标签: thread-safety arm atomic

假设我正在修改内存映射I / O寄存器中的几个位,并且可能另一个进程或ISR可能正在修改同一寄存器中的其他位。

可以使用ldrex和strex来防范这种情况吗?我的意思是,他们原则上可以因为你可以ldrex,然后更改位,然后将它拉回来,如果strex失败,则意味着另一个操作可能已经改变了reg,你必须重新开始。但是strex / ldrex机制可以用在不可缓存的区域吗?

我在raspberry pi上试过这个,I / O寄存器映射到用户空间,而ldrex操作给我一个总线错误。如果我将ldrex / strex更改为简单的ldr / str它可以正常工作(但不再是原子...)此外,ldrex / strex例程在普通RAM上运行正常。指针是32位对齐的。

这是strex / ldrex机制的限制吗?或BCM2708实现的问题,或内核设置的方式? (或者其他一些 - 也许我把它映射错了)?

4 个答案:

答案 0 :(得分:4)

感谢您提及我......

您不在资源本身上使用ldrex / strex对。像swp或测试和设置或任何你的指令集支持(对于arm它是swp和最近的strex / ldrex)。您在ram上使用这些说明,所有相关方都同意了一些ram位置。共享资源的进程使用ram位置来争夺对资源的控制,无论谁获胜,然后实际寻址资源。你永远不会在外围设备上使用swp或ldrex / strex,这没有任何意义。我可以看到内存系统没有给你一个独家的好回应(EXOKAY),这是你需要摆脱ldrex / strex无限循环。

您有两种共享资源的基本方法(也许更多,但这里有两种)。一个是你使用这个共享内存位置和共享资源的每个用户,争取赢得对内存位置的控制。当你赢了,然后直接与资源交谈。完成后放弃对共享内存位置的控制。

另一种方法是,您只允许一个软件与外围设备通信,其他任何人都不允许与外围设备通信。任何希望在外围设备上完成某​​些任务的人都要求一个资源为他们做这件事。这就像每个人都可以分享软饮料喷泉,而软饮料喷泉则在柜台后面,只有软饮料喷泉员工可以使用软饮料喷泉。那么你需要一个方案,要么让人们排队,要么让人们拿一个号码,然后叫他们喝完他们的饮料。除了与外围设备通信的单一资源之外,您还必须提出一个方案,例如fifo,以实质上使请求串行化。

这些都是荣誉系统。你希望没有其他人可以与不应该与外围设备通信的外围设备通话,或者谁没有赢得与外围设备通话的权利。如果您正在寻找硬件解决方案以防止人们与之交谈,那么,使用mmu但现在您需要管理谁赢得了锁定以及他们如何获得mmu解锁(不使用荣誉系统)并重新阻止以某种方式

您可能拥有中断处理程序和前台任务共享资源的情况,您可能有一个或另一个可以触摸资源,另一个请求请求。例如,资源可能是中断驱动的(例如串行端口),并且您可以让中断处理程序直接与串口硬件通信,如果应用程序/ forground任务想要完成某些操作,它会填写请求(将某些内容放入fifo / buffer)然后中断查看请求队列中是否有任何内容,如果是,则对其进行操作。

当然有,禁用中断并重新启用关键部分,但如果你希望你的中断有一些时间/延迟的概念,那些是可怕的...了解你在做什么,他们可以用来解决这个应用程序+是两个用户问题。

非缓存内存空间上的ldrex / strex:

我的篇幅可能有更多的文字,你什么时候可以使用ldrex / strex,不幸的是,arm文档在这方面并不是那么好。他们告诉你停止使用swp,这意味着你应该使用strex / ldrex。但是接下来切换到硬件手册,说明你不必支持单处理器系统上的独占操作。其中有两件事,ldrex / strex适用于多处理器系统,用于在多处理器系统上的处理器之间共享资源。这也意味着单处理器系统不一定支持ldrex / strex。然后它变得更糟。 ARM逻辑通常在处理器内核的边缘停止,L1高速缓存包含在该边界内,它不在axi / amba总线上。或者,如果您购买/使用L2缓存,则ARM逻辑将停在该层的边缘。然后,您将进入芯片供应商特定的逻辑。这就是您阅读硬件手册的逻辑,它说您不需要支持单处理器系统上的独占访问。所以问题是供应商特定的。而且它变得更糟,ARM的L1和L2缓存到目前为止我发现支持ldrex / strex,所以如果你有缓存,那么ldrex / strex将适用于供应商代码不支持它们的系统。如果您没有缓存,那就是当您在这些系统上遇到麻烦时(这是我写的最有用的东西)。

拥有ldrex / strex的处理器足够新,可以通过压缩器读取访问大量配置寄存器。埋藏在那里有一个" swp指令支持"用于确定您是否有交换。没有皮质-m3的人遇到无交换和没有ldrex / strex的情况?

Linux内核中的错误(还有很多其他错误以及其他对arm硬件和文档的误解)是在支持ldrex / strex的处理器上选择ldrex / strex解决方案而不确定它是否是多处理器,所以你可以(我知道两个实例)进入一个无限的ldrex / strex循环。如果你修改linux代码以便它使用swp解决方案(那里有任何解决方案的代码),那么linux将会工作。为什么只有两个人在互联网上谈到这个,我知道,是因为你必须关闭缓存以实现它(据我所知),谁会关闭两个缓存并尝试运行linux?实际上需要花费大量的工作才能成功关闭缓存,需要对linux进行修改才能使其工作而不会崩溃。

不,我不能告诉你这些系统,不,我现在也没有为ARM工作过。如果你知道在哪里看以及如何解释它,这些东西都在arm文档中。

答案 1 :(得分:4)

与先前的答案状态一样,ldrex / strex不是用于访问资源本身,而是用于实现保护资源所需的同步原语。

但是,我觉得有必要对架构位进行一些扩展:

  1. ldrex / strex(发音为load-exclusive / store-exclusive)受所有 ARM架构版本6及更高版本处理器支持,减去M0 / M1微控制器(的ARMv6-M)。
  2. 在架构上并不保证load-exclusive / store-exclusive可用于“Normal”以外的内存类型 - 因此在外围设备上巧妙使用它们将无法移植。
  3. 不推荐使用SWP指令,因为它的本质在多核系统中适得其反 - 它在ARMv6中已弃用,在某些ARMv7-A版本中是“可选”的,并且大多数ARMv7-A处理器已经要求在cp15 SCTLR中明确启用它。 Linux默认情况下没有,而是使用... load-exclusive和store-exclusive(@dwelch在上面引用的内容)通过undef处理程序模拟操作。因此,如果您希望代码可以在ARMv7-A平台上移植,请不要推荐SWP作为有效替代方案。
  4. 与不在内部可共享域(您的缓存一致性岛)的总线主控器同步需要额外的外部硬件 - 称为全局监视器 - 以便跟踪哪些主控器要求独家访问哪些地区。

    “单处理器系统上不需要”位听起来像是ARM术语妨碍了。四核Cortex-A15被认为是一个处理器...因此在Linux中测试“单处理器”不会产生任何差异 - 架构和互连规范保持不变,而且SWP仍然是可选的,可能不会在场。

    Cortex-M3支持ldrex / strex,但其互连(AHB-lite)不支持传播它,因此它无法使用它与外部主设备同步。它不支持SWP,从未在Thumb指令集中引入,它的互连也无法传播。

答案 2 :(得分:3)

通常,ldrexstrex需要来自内存系统的支持。您可能希望通过 dwelch 及其some answers应用引用extext。我相信你不能为内存映射I / O 做这件事。在{em>普通内存中,ldrexstrex更适用于Lock Free算法。

通常只有一个驱动程序应该负责一组 I / O 寄存器。软件将通过信号量等向该驱动程序发出请求,这些信号可以在普通SDRAM中与ldrexstrex一起实现。因此,您可以互锁这些 I / O 寄存器,但不能直接锁定。

通常,I / O寄存器将通过写一个来清除多路复用访问和其他方案来支持原子访问。

  1. 写一个清除 - 通常用于硬件事件。如果代码处理事件,那么它只写入该位。通过这种方式,多个例程可以处理同一寄存器中的不同位。
  2. 多路复用访问 - 通常中断启用/禁用将具有寄存器位图。但是,还有备用寄存器,您可以写入启用禁用特定寄存器的中断号。例如,intmask可能是两个32位寄存器。要启用int3,您可以将1<<3屏蔽到intmask或仅将3写入intenable寄存器。他们intmaskintenable通过硬件连接到相同的位。
  3. 因此,您可以使用驱动程序模拟内部锁定,或者硬件本身可以通过正常的寄存器写入来支持原子操作。在人们开始讨论免费锁定等待免费算法之前,这些方案已经很好地安静了一段时间。

答案 3 :(得分:0)

如果有问题的芯片有一个切换寄存器(写入时基本上与输出锁存器进行异或),可以解决这个问题。

  • 加载端口锁存器
  • 掩盖不相关的位
  • 具有所需输出的xor
  • 写入切换寄存器

只要两个进程不修改相同的引脚(而不是“相同的端口”)就没有竞争条件。

对于bcm2708,您可以选择其邻居未使用或永不更改的输出引脚,并以字节模式写入GPFSELn。但这只会确保您不会腐蚀他人。如果其他人正在以32位模式写入并且您中断它们,它们仍然会损坏您。所以它是一种黑客攻击。

希望这有帮助