Arm AArch64 alignment(对齐)

数据和指令必须与合适的边界保持对齐(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是否实现;

以下可以分为几类指令来说:

1.对于Load or Store of Single or Multiple registers instructions,不包含exclusive,acquire/release,atomic和MCMS指令,如果访问的数据块与地址非对齐,那么:

  • 如果SCTLR_ELx.A==1,那么上报alignment fault。
  • 如果SCTLR_ELx.A==0,那么允许unaligned访问。但是访问是否保证single-copy atomic取决于地址属性和FEAT_LSE2是否实现。

2.对于Load-Exclusive/ Store-Exclusive and Atomic instructions,如果访问的数据块与地址非对齐,那么:

  • 如果SCTLR_ELx.A==1,那么上报alignment fault。
  • 如果SCTLR_ELx.A==0,那么是否允许访问取决于地址属性和FEAT_LSE2是否实现,如果允许访问,那么就算是非对齐,也要保证single-copy atomic。

3.对于Non-atomic and non-exclusive Load-Acquire/Store-Release instructions,如果访问的数据块与地址非对齐,那么:

  • 如果SCTLR_ELx.A==1,那么上报alignment fault。
  • 如果SCTLR_ELx.A==0,那么是否允许访问取决于地址属性和FEAT_LSE2是否实现,以及要看SCTLR_ELx.nAA的值。SCTLR_ELx.nAA决定了访问的数据块跨地址16-byte边界是否允许访问。

4. 对于Memory Copy and Memory Set instructions, 如果访问的数据块与地址非对齐,那么:

  • 无论SCTLR_ELx.A的值为多少,都会进行对齐检查,也就是会上报alignment fault。
  • 如果Xn不是16的倍数,也会上报alignment fault。
  • 如果Xd没有对齐到16的倍数,也会产生alignment fault。

三、总结

可以用下面的伪代码和指令归属类型来总结上述内容,就很容易明白了。

判断alignment fault伪代码:

指令归属类型:

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-01 18:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-01 18:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-01 18:38:02       82 阅读
  4. Python语言-面向对象

    2024-02-01 18:38:02       91 阅读

热门阅读

  1. 深入探讨 React 组件生命周期(旧版)

    2024-02-01 18:38:02       61 阅读
  2. IO 模型(BIO、NIO、多路复用)

    2024-02-01 18:38:02       53 阅读
  3. 127-前途与好人

    2024-02-01 18:38:02       44 阅读
  4. Shell - 学习笔记 - 2.6 - Shell $*和$@之间的区别

    2024-02-01 18:38:02       60 阅读
  5. Leetcode刷题(三十二)

    2024-02-01 18:38:02       54 阅读
  6. js跳转页面都有哪些方式?

    2024-02-01 18:38:02       66 阅读
  7. RK3568开发笔记-感光芯片ISL29035调试记录/IIO子系统

    2024-02-01 18:38:02       41 阅读
  8. 机器学习系列——(二)主要任务

    2024-02-01 18:38:02       55 阅读
  9. (安卓)跳转应用市场APP详情页的方式

    2024-02-01 18:38:02       54 阅读
  10. elementui 回到顶部报错

    2024-02-01 18:38:02       53 阅读