为什么需要缓存内存对齐?

时间:2018-01-03 08:20:05

标签: c caching memory gnu mips32

我正在使用mips32,gcc编译器进行微mips优化。每个核心都有自己的缓存。 Core A os - ThreadX,Core B os - rtos。我希望将指针和大小从Core A传递到Core B. 我们来看看以下流程:

1. Core A(ThreadX): pass pointer and size to Core B
2. Core B(RTOS): write to pointer size bytes
3. Core B(RTOS): flush(pointer)
4. Core A(ThreadX): pointer cacheInvalidate(pointer)
5. Core A(RTOS): copy from pointer to buffer

我使用未对齐的地址,似乎它引起了一些意想不到的问题。 通过对齐的地址后,我无法重现问题。 我是否必须使用对齐的地址?为什么?如果我通过未对齐的地址,我应该期待什么行为?

1 个答案:

答案 0 :(得分:1)

如果你关心便携式的话,不要在如此低的水平上推理。如果你没有,请查看编译器生成的汇编程序代码(例如使用gcc -O -fverbose-asm -S和{{3} }})。

如果您关心特定的实现,您应该提及它(编译器和版本,GCC标志,操作系统,处理器和品牌)。但要小心optimization,成为UB的undefined behavior

如果使用C99在C:中进行编码,则需要操作系统内容和支持,例如: scared(使用pthreads(7))。所以请阅读futex(7)。使用符合C11的实现(请参阅pthread tutorial),您可以使用n1570atomic operations

  

我是否必须使用对齐的地址?

也许是的。您的硬件以不同于非对齐数据的方式访问对齐的数据(并且更快,更原始&#34;)。 <threads.h>在其详细信息中特定于特定处理器。