ARM Cortex-M 堆对齐
ARM Cortex-M heap alignment
在 之后,我开始怀疑堆是否也应该与 8 字节边界对齐。
ARM Cortex EABI 指出,对于所有对外部函数的调用,堆栈必须是 8 对齐的。我找不到任何关于堆对齐是否有任何限制的信息。似乎有一些建议指出堆也应该按 8 对齐,但大多数公开可用的内存管理代码都是按 4 对齐。
堆栈对齐要求不应与堆对齐有任何关系(只要遵守字边界),因为在堆和堆栈之间复制时不会保留对齐。另外,我想不出有什么理由在指向 8 字节宽的项目时将编译器限制为 8 对齐指针。
任何人都可以确认 4 字节对齐对于堆来说足够了吗?
对于 Cortex-M 处理器的特定情况,字对齐足以用于堆分配,因为 Cortex-M 上没有指令比字对齐具有更严格的对齐要求。
对于 Cortex-M4,这在 Cortex-M4 Devices Generic User Guide 第 3.3.5 节中声明:
An aligned access is an operation where a word-aligned address is used
for a word, dual word, or multiple word access, or where a
halfword-aligned address is used for a halfword access. Byte accesses
are always aligned.
也就是说,即使对于编译器通常用于 64 位数据类型的 LDRD/STRD(双字)和 LDM/STM(多字访问)指令,对齐访问的要求也是仅字对齐。
在
ARM Cortex EABI 指出,对于所有对外部函数的调用,堆栈必须是 8 对齐的。我找不到任何关于堆对齐是否有任何限制的信息。似乎有一些建议指出堆也应该按 8 对齐,但大多数公开可用的内存管理代码都是按 4 对齐。
堆栈对齐要求不应与堆对齐有任何关系(只要遵守字边界),因为在堆和堆栈之间复制时不会保留对齐。另外,我想不出有什么理由在指向 8 字节宽的项目时将编译器限制为 8 对齐指针。
任何人都可以确认 4 字节对齐对于堆来说足够了吗?
对于 Cortex-M 处理器的特定情况,字对齐足以用于堆分配,因为 Cortex-M 上没有指令比字对齐具有更严格的对齐要求。
对于 Cortex-M4,这在 Cortex-M4 Devices Generic User Guide 第 3.3.5 节中声明:
An aligned access is an operation where a word-aligned address is used for a word, dual word, or multiple word access, or where a halfword-aligned address is used for a halfword access. Byte accesses are always aligned.
也就是说,即使对于编译器通常用于 64 位数据类型的 LDRD/STRD(双字)和 LDM/STM(多字访问)指令,对齐访问的要求也是仅字对齐。