AArch64 是否支持未对齐访问?

Does AArch64 support unaligned access?

AArch64 是否原生支持未对齐访问?我问是因为目前 ocamlopt 假设 "no".

提供用于严格对齐检查的硬件位未打开(在 x86 上,没有通用 OS 实际上会这样做),AArch64 确实允许对 Normal 的未对齐数据访问(不是设备)内存与常规 load/store 指令。

但是,编译器仍希望保持对齐数据的原因有多种:

  • 读取和写入的原子性:保证自然对齐的加载和存储是原子的,即如果一个线程读取对齐的内存位置同时另一个线程写入相同的位置,则读取只会 return 旧值或新值。如果该位置未与访问大小对齐,则该保证不适用 - 在这种情况下,读取可能 return 两个值的某种未知混合。如果该语言有一个并发模型,它依赖于这种情况不会发生,它可能不会允许未对齐的数据。
  • 原子读-修改-写操作:如果语言有一个并发模型,其中一些或所有数据类型可以原子地更新(不仅仅是读或写),那么对于这些操作,代码生成将涉及使用 load-exclusive/store-exclusive 指令来构建原子读取-修改-写入序列,而不是普通的 loads/stores。如果地址未与访问大小对齐,独占指令将始终出错。
  • 效率:在大多数内核上,未对齐的访问充其量仍比正确对齐的访问多花费至少 1 个周期。在最坏的情况下,单个未对齐的访问可以跨越缓存行边界(这本身就有额外的开销),并产生 两次 缓存未命中甚至两次连续的页面错误。除非您处于内存极其受限的环境中,或者无法控制数据布局(例如,将数据包从网络接收缓冲区中拉出),否则最好避免未对齐的数据。
  • 必要性:如果语言有合适的数据模型,即没有指针,并且来自外部源的任何数据都已经在较低级别编组为适当的数据类型,那么无论如何都不需要未对齐的访问,这使得编译器的生活更容易完全忽略这个想法。

我不知道 OCaml 特别关注什么,但如果是 "all of the above" 我当然不会感到惊讶。