c - 确保一个 cpu 在另一个 cpu 读取 "double"之前写入了 "double"?

标签 c linux assembly arm cpu

我打算在双核 ARM Cortex-A9 CPU 上运行一个操作系统(一个内核运行 Linux,另一个没有操作系统)。

在非操作系统端,我们将 64 位 double 写入 DDR 内存,然后 Linux 端读取它。

因为 CPU 有一个到 DDR 的 32 位总线,值在两个总线周期内传输,这意味着如果在总线上混合读写,值可能会被破坏。

我该怎么做才能让它以安全的方式工作?

最佳答案

您没有具体说明您的订购要求是什么或您打算如何发出更改信号 - 所以我将简单地回答问题:

如果在 64 位对齐位置上执行,LDREXD/STREXD 指令保证是单副本原子的(如果位置不是,它们将中止)。如果你正在做一些无锁的事情,那可能对你有好处。如果没有,只需使用互斥锁实现即可。

当然,LDREXD/STREXD 只有在满足以下任一条件时才能正常工作:

  • Linux 和您的其他软件都启用了缓存,两个 cpu 都设置了“SMP”位,并且都将共享区域映射为可回写缓存。

  • Linux 和您的其他软件都将共享区域视为未缓存,并且您的 SoC 为内存设备实现了一个全局监视器

关于c - 确保一个 cpu 在另一个 cpu 读取 "double"之前写入了 "double"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16708152/

相关文章:

python - 如何将 Python 对象转换为 C 变量?

python - 在 linux : No module named dal 上使用 Django 导入错误

c - 将参数从 C 传递到程序集

c - 有没有更好的方法来检查这两个变量而不是四个 ifs?

c函数向下舍入一半

c - 修改返回地址为shellcode

linux - fgets 不以换行符终止

c++ - 如何让Anjuta DevStudio像Eclipse一样提示提示?

c - 需要帮助将 .c 文件编译为 shellcode

assembly - 汇编函数中的错误返回 (x86)