2

我知道这可能是一个奇怪的用法。我只想知道我是否可以在禁用 SCU 的情况下使用 LDREX/STREX。

我正在使用双核 Cortext-A9 SoC。两个核心以 AMP 模式运行:每个核心都有自己的操作系统。虽然内存控制器是共享资源,但每个内核都有自己的内存空间。一个人无法访问另一个人的内存空间。由于不需要缓存一致性,因此未启用 SCU。同时,我还有一个共享内存区域,两个内核都可以访问。共享内存区域是非缓存的,以避免缓存一致性问题。

我在这个共享内存区域中定义了一个自旋锁。此自旋锁用于保护共享资源访问。现在,自旋锁的实现很简单,如下所示:

void spin_lock(uint32_t *lock)
{
    while(*lock);
    *lock = 1;
}
void spin_unlock(uint32_t *lock)
{
    *lock = 0;
}

其中,锁是共享内存中的一个变量,因此两个内核都可以访问该锁。

这个实现的问题是访问锁不是独占的。这就是为什么我想使用 LDREX/STREX 来实现自旋锁。请允许我重申我的问题:

我可以在不启用 SCU 的情况下使用 LDREX/STREX 吗?

谢谢!

4

3 回答 3

2

所以......你的问题的直接答案是,是的,这是可能的 - 只要内存系统中的其他东西实现共享内存区域的独占监视器。如果没有,那么您的 STREX 将始终返回 OK(而不是 EXOK),可在结果寄存器中观察到失败。

但是,为什么不启用 SCU?显然,您要尝试做的事情至少需要该区域的两个操作系统之间的内存的一致视图。使用 PIPT 数据缓存,您不会看到缓存行的任何别名,具体取决于它们在每个图像中的映射方式。

于 2015-04-22T12:27:17.357 回答
1

总的来说,答案是否定的。这里有两个问题:

1)您不能在未缓存的内存上使用加载/存储独占。排他操作仅在“正常”幂等内存上运行。

2) ARM 手册没有指定独占监视器如何与内存一致性一起工作,但任何合理的实现本质上都是将监视器置于缓存行获取机制中。如果您禁用了高速缓存行侦听,您很可能使您的芯片上的监视器无法正常工作。

于 2015-04-21T22:51:25.753 回答
1

您唯一(格式不正确)的问题,

我可以在不启用 SCU 的情况下使用 LDREX/STREX 吗?

在理想的 ARM 世界中,是的,这是可能的。即,有可能某天,某天你可以做到这一点。我想你的意思是,

我可以在系统中未启用 SCU 的情况下使用 LDREX/STREX吗?

不幸的是,ARM ARM 有点像政治/官僚文件。在阅读“强烈建议”、“不可预测”、“未知”和可以时,您必须格外小心。所有程序员都希望将ldrex/strex其应用于所有内存。事实上,如果 BUS 控制器(通常是 AXI-NIC)实现了一个监视器,那么支持备受喜爱的swp指令就没有问题了。StackOverflow 上有很多帖子,人们想swpldrex/strex.

在您阅读和重新阅读 ARM ARM 的双重发言(它是为程序员编写的,也是硅实现者编写的)之后,很明显监控逻辑可能是在缓存中实现的。缓存控制器必须实现脏线广播。 脏线广播与“监视器”非常相似,而您的“保留颗粒”很可能是缓存线大小(这是一种巧合)。

ARM ARM 是为可能希望实现 Cortex-A CPU 的人编写的通用文档。编写它是为了使他们的双手(创造力)不会被束缚在缓存中实现监视器。

因此,您需要阅读有关特定 Cortex-A9 SOC 的特定文档。它可能只支持ldrex/strex缓存内存。事实上,建议pld在执行之前发出 a 以确保内存在缓存中ldrex,这意味着您需要激活系统中的 SCU。我猜您担心 SCU 会增加延迟的一些额外周期?

我认为其中一些信息使许多非常聪明的人感到困惑。注意possibleis之间的区别。StackOverflow 上的每个人都可能希望监视器在总线控制器(或核心内存芯片)中实现。然而,对于大多数真正的芯片来说,情况并非如此。

可以肯定的是,如果您希望将来证明您的代码/操作系统可以移植到更新或不同的 Cortex-A CPU,即使您的芯片组确实支持缓存子系统之外的“全局监视器”,您也不应该做出这种假设。

于 2015-04-22T16:48:18.303 回答