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

Why cached memory alignment required?

我正在研究 mips32,具有 micro-mips 优化的 gcc 编译器。每个核心都有自己的高速缓存。核心 A os - ThreadX,核心 B os - rtos。我希望将指针和大小从核心 A 传递到核心 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 -SGCC ).

如果您关心特定的实现,您应该提及它(编译器和版本,optimization flags, operating system, processor and brand). But beware of undefined behavior, be scared of UB。

如果使用 C99 在 C: 中编码,您需要操作系统的东西和支持,例如pthreads(7) (which uses futex(7)). So read a pthread tutorial. with a C11 conforming implementation (see n1570), you could use atomic operations, and <threads.h>

Do I have to work with an aligned address?

也许是的。您的硬件访问对齐数据的方式与非对齐数据不同(并且更快,更多 "atomic")。 Cache coherence 特定于特定处理器的详细信息。