目录

1,对齐传输和非对齐传输

2,AArch32 Alignment support

2.1 Instruction alignment 指令对齐

2.2 Unaligned data access 非对齐数据访问

2.3 SCTLR.A  Alignment check enable

3,AArch64 Alignment support

3.1 Instruction alignment 指令对齐

3.2 Alignment of data accesses 对齐数据访问

3.3 普通Load 和Store指令(包括单寄存器和多寄存器)

3.4 Load-Exclusive/ Store-Exclusive 和Atomic 指令

3.7 FEAT_LSE2, Large System Extensions v2

3.8 对齐访问SP寄存器

3.9 对齐访问 PC寄存器


如果非对齐访问出错,可以考虑以下问题:

  • 当前架构是否支持非对齐数据访问。
  • 系统控制寄存器SCTLR.A是否打开对齐访问检查功能。
  • 使用的指令是否支持非对齐访问。
  • 操作的对象(SP,PC,Normal memory,Device memory)是否支持非对齐访问。
  • 当前系统所使用的是大端还是小端。

1,对齐传输和非对齐传输

参考Cortex-M3与Cortex-M4权威指南 第6.6章:

由于存储器系统为32位的(至少从编程模型的角度来看是这样的),大小为32位(4 byte(字节),或 1 word(字))或16位(2字节,或半字)可以是对齐也可以是不对齐的。

对齐传输的意思是地址值为大小(以字节为单位)的整数倍。例如,字大小的对齐传输可以执行的地址为0x00000000、0x00000004、···、0x00001000、0x00001004等;类似地,半字大小的对齐传输可以执行的地址则为0x00000000、0x00000002、···、0x00001000、0x00001002等。
对齐和非对齐传输的实例下图所示。

一般来说,多数经典ARM处理器(如ARM7 /ARM9 /ARM10)都只允许对齐传输。这就意味着在访问存储器时,字传输地址的bit[1]和bit[0]为0,而半字传输地址的bit[0]为0。例如,字数据可位于0x1000或0x1004,而不能位于0x1001、0x1002或0x1003,对于半字数据,地址可以为 0x1000 或 0x1002,而不能为 0x1001。所有的字节传输都是对齐的。
Cortex-M3和Cortex-M4处理器都支持普通存储器访问(如LDR、LDRH,STR以及STRH 指令)的非对齐数据传输。
另外还有一些限制:

  • 多加载/存储指令不支持非对齐传输。
  • 栈操作指令(PUSH/POP)必须是对齐的。
  • 独占式访问,Exclusive Access(如 LDREX 或 STREX)必须是对齐的,否则就会触发错误异常(使用错误)。
  • 位段操作不支持非对齐传输,因为其结果是不可预测的。

当非对齐传输是由处理器发起时,它们实际上会被处理器的总线接口单元转换为多个对齐传输。这个转换是不可见的,因此应用程序开发人员无须考虑这个问题。

不过,当产生非对齐传输时,它会被拆分为几个对齐传输,因此本次数据访问会花费更多的时钟周期,可能对需要高性能的情形不利。若追求更高的性能,确保数据处于合适的对齐是有必要的。
多数情况下,C编译器不会产生非对齐传输,它只会在以下情况中出现:

  1. 直接操作指针。
  2. 包含非对齐数据的数据结构增加“_packed”属性。
  3. 内联/嵌入式汇编代码。

2,AArch32 Alignment support

2.1 Instruction alignment 指令对齐

A32 指令是 字对齐的(word-aligned)。

T32 指令是 半字对齐的(halfword-aligned)。

2.2 Unaligned data access 非对齐数据访问

在ARM A系列的实现中,通过一些Load/Store 指令是支持对Normal memory进行非对齐数据访问的。关于Normal memory和device memory的细节描述,可以参考博文:ARMv8内存属性与类型(Memory types and attributes)简介_arm 内存属性_SOC罗三炮的博客-CSDN博客

如下图红框中所示,有一部分的 Load/Store指令可以实现非对齐访问,比如最常用的LDR与STR指令。当然前提是,系统控制寄存器SCTLR里的对齐检查位没有被enable,即SCTLR.A = 0:

  • 通过设置 SCTLR.A 位,可以控制除了Hyp mode外,其他任何模式下的对齐访问。
  • 通过设置HSCTLR.A 位,可以控制Hyp mode下的对齐访问。

任何对Device memory的非对齐访问,都会产生对齐异常。

2.3 SCTLR.A  Alignment check enable

SCTLR.A位控制住系统对Normal memory的非对齐访问。在PL0或者PL1下,检查对齐错误:

  • SCTLR.A = 0, reset value,disable 对齐错误检查,在PL0或者PL1时,不会检查 Load/Store指令对一个或者多个寄存器进行操作时,访问的数据元素的大小与地址是否对齐。
  • SCTLR.A = 1,enable 对齐错误检查,在PL0或者PL1时,不会检查 Load/Store指令对一个或者多个寄存器进行操作时,访问的数据元素的大小与地址是否对齐。如果发现非对齐访问,会产生Data Abort 异常。

此外,Load/store exclusive 和load-acquire/store-release指令自带对齐检查,所以会忽略SCTLR.A的值。

3,AArch64 Alignment support (B2.5 )

3.1 Instruction alignment 指令对齐

A64 指令是 字对齐的(word-aligned)。

3.2 Alignment of data accesses 对齐数据访问

同A32一样,任何对Device memory属性的非对齐访问,都会造成对齐错误,产生Data Abort异常。

对于Normal memory的非对齐访问,其行为取决于:

  • 内存访问的指令(比如 load、store)
  • 被访问的内存的内存属性(比如Normal 或者Device)
  • SCTLR_ELx.{A, nAA}的值,是否打开对齐访问检查。
  • FEAT_LSE2 属性是否实现。

3.3 普通Load 和Store指令(包括单寄存器和多寄存器)

对于 普通的Load 和Store指令(不是Exclusive access、Atomic、SETG* Memory Copy and Memory Set等指令),无论是单寄存器操作还是多寄存器操作,如果被访问的地址与被访问的数据元素的大小不一致(非对齐访问),则:

  • 如果SCTLR_ELx.A = 1,将会产生一个对齐错误。
  • 如果SCTLR_ELx.A = 0,将执行非对齐访问(Normal memory)。

对于 普通的Load 和Store指令,非对齐访问的定义是基于被访问元素的大小,而不是整个内存访问的大小。

3.4 Load-Exclusive/ Store-Exclusive 和Atomic 指令

对于Load-Exclusive/ Store-Exclusive 和Atomic 指令,如果SCTLR_ELx.A = 1,将会产生一个对齐错误。

如果SCTLR_ELx.A = 0,这取决于FEAT_LSE2,具体分析可以查看文档:DDI0487G_a_armv8_arm.pdf。

如果FEAT_LSE2特性没有被实现,如果访问没有与数据结构大小对齐的地址,这些指令将会产生对齐错误。

3.5 Non-atomic Load-Acquire/Store-Release指令

对于非exclusive 或者atomic的Load-Acquire/Store-Release指令,

如果SCTLR_ELx.A = 1,将会产生一个对齐错误。

如果SCTLR_ELx.A = 0,如果FEAT_LSE2特性没有被实现,如果访问没有与数据结构大小对齐的地址,这些指令将会产生对齐错误。

3.7 FEAT_LSE2, Large System Extensions v2

FEAT_LSE2为 load和store操作引入 单次拷贝原子性需求(single-copy atomicity requirements)以及对齐访问需求(alignment requirements)。

  • This feature is supported in AArch64 state only.
  • This feature is OPTIONAL in Armv8.2 implementations.
  • This feature is mandatory in Armv8.4 implementations

可通过ID_AA64MMFR2_EL1的AT位来查看是否实现了该属性。

与对齐的访问相比,未对齐的访问通常需要额外的周期(cycles)才能完成。

3.8 对齐访问SP寄存器

64 bit宽的Stack Pointer 寄存器,堆栈指针需要16个byte对齐。

当堆栈指针被用作计算的基址时,不管指令应用了任何偏移量,其中堆栈指针的[3:0]位不是0b0000,这就是非对齐的堆栈指针。处理器可以配置为:如果load/store指令使用了未对齐的堆栈指针,处理器将生成栈指针未对齐异常。

伪代码如下:

通过判断 SCTLR的 SA0或者SA位是否为0,从而决定是否产生栈指针非对齐异常。

3.9 对齐访问 PC寄存器

64 bit宽的Program Counter 寄存器里保存着当前执行的指令的地址。如果执行A64 指令的时候不是 字对齐(word-aligned),将会产生PC 对齐错误。

PC对齐检查将生成一个与指令获取相关的PC对齐错误异常,在AArch64状态时,试图从架构上执行一条指令,该指令是用未对齐的PC获取的。非对齐的PC是指PC的[1:0]位不是0b00,也就是地址需要以0、4 、 8 、c结尾,比如PC可以为0x1000或0x1004,而不能为0x1001、0x1002或0x1003

一个PC 非对齐异常将会 把Exception Syndrome Register (ESR)寄存器的EC 位写入 0x22,并且会产生一系列的错误。

检查PC非对齐异常的伪代码如下:

参考文章:

一文带你深入了解《C语言对齐与非对齐访问》(ARM指令集)_对齐访问和非对齐访问_狂奔De鸵鸟的博客-CSDN博客

ARMv8-A非对齐数据访问支持(Alignment support)相关推荐

  1. CM3中数据传输对齐/非对齐方式

    在CM3中,非对齐的数据传输只发生在常规的数据传送指令中,如LDR.LDRH.LDRSH.其他指令则不支持,包括: 1.多个数据的加载.存储(LDM/STM). 2.堆栈操作PUSH.POP. 3.互 ...

  2. 转载:使用Spring进行数据访问(Data Access With Spring)

    Table of Contents 1.1. 统一的数据访问异常层次体系(Consistent Exception Hierarchy In Spring) 1.1.1. DAO模式的背景(Backg ...

  3. ARM非对齐访问和Alignment Fault

    转载自ARM非对齐访问和Alignment Fault - 者旨於陽 - 博客园 (cnblogs.com) 1.指令对齐 A64指令必须word对齐.尝试在非对齐地址取值会触发PC alignmen ...

  4. 结构体成员非对齐访问所带来的思考

    [摘要]本文介绍了内存访问时为什么需要对齐及不对齐时带来的影响.接着介绍了如何改变对齐规则来保证CPU能够访问非对齐内存.最后介绍了结构体设计时需要注意的问题,如何调整成员顺序或者填充特定单元来避免平 ...

  5. Axi:名词解释、乱序、间插、卷绕、窄带访问、非对齐访问、OST

    信号说明: AWBURST.ARBURST: 指示burst type,有3种burst类型. Fixed:固定地址模式,每次burst传输首地址固定,用于访问FIFO INC:递增递增模式,每次传输 ...

  6. rtthread 字节对齐问题 int指针访问非对齐地址崩溃

    rtthread 字节对齐问题 int指针访问非对齐地址崩溃 环境: SOC: i.MX RT1050 底板: 野火 RT1052 Kernel: rt-thread 背景: 我正在实现解析udp包, ...

  7. [转]MIPS 下非对齐访问的问题

    1.问题 MIPS 下使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫做地址对齐. 比如在 MIPS 平台上,lh 读取一个半字时,存储器的地址必须是 2 的整数 ...

  8. 【编译原理笔记15】运行存储分配概述,静态存储分配,栈式存储分配,调用序列和返回序列,非局部数据的访问,符号表,符号表建立

    本次笔记内容: 7-1 运行存储分配概述 7-2 静态存储分配 7-3 栈式存储分配 7-4 调用序列和返回序列 7-5 非局部数据的访问 7-6 符号表 7-7 符号表建立 本节课幻灯片,见于我的 ...

  9. 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层

    背景 17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论.项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具:而在线业 ...

最新文章

  1. 站点某些网页想显示母版页内的用户控件,某些网页不想显示,怎样实现
  2. Windows上卸载SqlServer数据库
  3. android 缩进轮播图,如何利用纯css实现图片轮播
  4. 简记用ArcGIS处理某项目需求中数据的步骤
  5. Jenkins远程命令执行漏洞(CVE-2018-1000861复现)
  6. 关于javascript中apply()和call()方法
  7. 20180602_Eclipse配置Maven的本地仓库和阿里云镜像
  8. laravel连接多个不同数据库的单例类
  9. oracle不提交事务语句,oracle查找客户端未提交的事务语句
  10. VASSISTX在vs里面应用的快捷键
  11. 腾讯微博qq说说备份导出工具_软件推荐Day51 其他工具类 腾讯微博备份
  12. 64码高清电视 android版,64体育app
  13. Android 白天黑夜模式切换换肤
  14. herf(超链接、锚链接)
  15. 税务计算机违规外联整改报告,县地税局开展税务业务专网及其终端“违规外联”检查...
  16. NAND flash 和 NOR flash 区别
  17. 音视频从入门到精通——FFmpeg之swr_convert音频重采样函数分析
  18. 2021-02-14
  19. 自学编程的人,90%以上都会掉进这些坑,避开这些误区能提高N倍学习效率
  20. PHP扩展undefined symbol,解决 undefined symbol: php_pdo_register_driver in Unknown on line 0

热门文章

  1. 计算机考研调剂信息大全!目前整理的全部计算机类调剂
  2. fir 滤波参数的含义_详解FIR滤波器与IIR滤波器的具体区别
  3. 兰州交通大学计算机考研复试贴,兰州交通大学通信工程考研复试经验小结
  4. SRA Toolkit简单使用
  5. 若依框架(SpringBoot)增加SQL防注入处理,SpringBoot增加SQL防注入
  6. 【深度学习基础】Mac系统安装Anaconda
  7. python怎么定义array_python怎么定义数组
  8. 从零开始的树莓派开发(一):系统配置
  9. linux操作系统ping不通外网域名问题
  10. 车辆工程常用英文缩写