我正在研究 mips32,具有 micro-mips 优化的 gcc 编译器。每个核心都有自己的高速缓存。核心 A 操作系统 - ThreadX,核心 B 操作系统 - 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
我使用了未对齐的地址,似乎它导致了一些意外的问题。 通过对齐地址后,我未能重现这些问题。 我必须使用对齐的地址吗?为什么?如果我传递未对齐的地址,我应该期待什么行为?
最佳答案
如果您关心可移植的 C,请不要在如此低的级别进行推理。如果您不关心,请查看编译器生成的汇编代码(例如,将 gcc -O -fverbose-asm -S
与 GCC 一起使用)。
如果您关心特定的实现,您应该提及它(编译器和版本、optimization 标志、操作系统、处理器和品牌)。但要小心undefined behavior ,为scared布法罗大学。
如果用 C: 和 C99 进行编码,您需要操作系统的东西和支持,例如pthreads(7) (使用 futex(7) )。所以请阅读pthread tutorial 。对于符合 C11 的实现(请参阅 n1570 ),您可以使用 atomic operations ,和 <threads.h>
Do I have to work with an aligned address?
也许是的。您的硬件以与非对齐数据不同的(更快且更“原子”)方式访问对齐数据。 Cache coherence其详细信息特定于特定处理器。
关于c - 为什么需要缓存内存对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48073612/