数据和指令必须与合适的边界保持对齐(alignment)。访问是否对齐会影响ARM核的性能,并且在将代码从早期的体系结构移植到ARMv8-A时可能会出现可移植性问题。出于性能原因,或者在移植代码时,都值得去注意下对齐问题。本文将讲述了ARMv8-A AArch64的对齐。
一、指令对齐
指令对齐(Instruction alignment)比较简单,A64指令必须word对齐。如果从非对齐位置读取指令的话,会报PC对齐错误。
二、数据访问对齐(Alignment of data accesses)
数据访问对齐(Alignment of data accesses)稍微复杂点,取决于访问类型、地址属性、系统支持的特性和系统的配置等。
2.1 Device memory
Device memory可以分为多种,不过任何非对齐访问Device memory都会上报对齐错误。
2.2 Normal memory
对Normal memory的非对齐访问取决于以下所有条件:
- 访问内存的指令类型;
- 访问地址的内存属性;
- SCTLR_ELx.{A, nAA}寄存器域段的值;
- FEAT_LSE2是否