应用程序级内存模型
此章节给内存模型一个应用层次的视角,它包括以下几节:
A3-104 地址空间 A3-106 对齐支持 A3-108 端模式支持 A3-112 同步和信号量 A3-123 内存类型属性和内存顺序模型 A3-139 访问权限 内存访问顺序 高速缓存和内存等级----注意:--------------
在这个章节,系统寄存器名称通常和章节4 VSMA(虚拟存储器系统构架)中的系统控制寄存器相关,例如SCTLR。如果寄存器包括PMSA(保护存储器体系结构)应用,那么它也会在章节6 PSMA中的系统控制寄存器中出现。
A3.1 地址空间
应用程序级内存模型使用一个32位8字节模型,覆盖4G字节。字节地址被看成无符号类型,从0到 -1。地址空间同样可以看成:
l 32位字:
— 每个字的地址是字对齐的,意味着地址可被4整除并且地址的最低位位0b00
— 字在字对齐地址A包括了4个字节,分别在A,A+1,A+2和A+3中。
l 16位半字:
— 每个半字的地址是半字对齐的,意味着地址可被2整除并且地址的最低位位0b0。
— 半字在半字对齐地址A包括了2个字节,分别在A,A+1中。
在一些条件下ARM架构支持访问半字和字,这些字和半字对于合适的访问尺寸来说是不对齐的,详细信息查看A3-106对齐支持。
正常条件下,地址计算使用普通整数指令,意味着地址循环如果计算超出了地址空间,另一种方法描述这种现象是任何地址计算的时候都取 的模。
A3.1.1 地址溢出
地址溢出的现象出现在当内存地址增数超过顶端地址空间(0XFFFFFFFF)。当出现这种情况的时候,地址卷绕。所以,例如地址0XFFFFFFFF增加2得到的地址为0X00000001。
地址向下溢出的现象出现在当内存地址减数超过底端地址空间(0X00000000)。当出现这种情况的时候,地址卷绕。所以,例如地址0X00000002减少4得到地址0XFFFFFFFE。
当处理器执行正常顺序执行指令,每条指令之后它都会找到下一条指令的地址通过下述计算命令:
(当前指令地址)+(执行指令地址大小)
这种计算能导致地址空间溢出。
----注意:--------------
执行指令的大小依赖于目前指令配置,也能依赖于指令执行。
任何依赖于地址空间的多字节读取的条件下,向上溢出或者向下溢出是不可预知的,这种应用于数据和指令访问。
下述的规则定义了不可预知的访问:
1. 如果处理器执行的一条指令中(地址,大小,或者对齐)包含字节(0XFFFFFFFF和0X00000000),结果是不可预知的。
这些不可预知的例子包含如下:
l 在下述任意一种条件下,所依赖于顺序执行的地址位于0X00000000:
------- 在地址0XFFFFFFFC执行一个4字节指令
------- 在地址0XFFFFFFFE执行一个2字节指令
------- 在地址0XFFFFFFFF执行一个1字节指令
l 尝试着去执行一条超过顶端内存的指令,例如:
------- 在地址0XFFFFFFFE执行一个4字节指令
------- 在地址0XFFFFFFFF执行一个2字节指令
2. 如果处理器执行的一条加载或者存储指令,其中计算地址,总访问大小,对齐等操作访问到了0XFFFFFFFE和0X00000000,结果将是不可预知的。
不可预知行为包括如下例子:
l 尝试着去执行一个非对齐的加载或者存储操作超过了内存顶部,例如:
------- 一个字加载或者存储操作从地址0XFFFFFFFD
------- 一个半字加载或者存储操作从地址0XFFFFFFFF
l 尝试去执行一个多字节的加载或者存储操作超过了顶部内存,日入:
-------一个两字节的加载或者存储操作从地址0XFFFFFFFC和0X00000000
------- 一个先进SIMD(单指令多数据流)多元素加载或者存储包含了0XFFFFFFFF或者0X00000000。
不可预知的行为仅仅应用可以执行的指令,包括那些条件码检验错误的指令。大部分ARM在当前执行指令启用预取指令。如果预取指令超过了顶部地址空间,它不会导致不可预知行为,除非预取指令里面有一条执行了的溢出地址。
----注意:--------------
在一些条件下,多字的操作能执行地址-4操作。如果这种计算向下溢出地址空间,计算结果将是不可预知的。
A3.2 对齐支持
ARM架构指令对齐如下:
l ARM架构是字对齐的。
l Thumb 和ThumbEE指令集是半字对齐的。
l JAVA 字节代码是字节对齐的。
在ARMV7 架构中,一些加载、存储指令支持非对齐数据访问,像非对齐数据访问中描述的那样。
关于以前版本ARM架构的对齐支持的更多信息,查看对齐(2456页)
A3.2.1 非对齐数据操作
一个ARMV7的实现必须支持非对齐数据访问,可以通过一些加载和存储指令,像表3-1所示。软件可以设置SCTLR(系统控制寄存器)。它控制着下述指令产生的非对齐访问是否导致一个对齐错误数据终止异常。
表A3-1加载/存储指令对齐需求
指令
对齐检查
如果检查失败结果将 当:
SCTLR.A为 0 SCTLR.A为 1
LDRB, LDREXB, LDRBT, LDRSB, LDRSBT , STRB,
STREXB, STRBT, SWPB, TBB
无
―――――――――――――――――
―――――――――――――――
LDRH, LDRHT, LDRSH, LDRSHT ,STRH, STRHT, TBH
半字
非对齐访问
对齐错误
LDR , LDRT, STR , STRT
PUSH, encodings T3 and A2 only
POP , encodings T3 and A2 only
字
非对齐访问
对齐错误
LDREXH, STREXH
半字
对齐错误
对齐错误
LDREX, STREX
字
对齐错误
对齐错误
LDREXD, STREXD
双字
对齐错误
对齐错误
All forms of LDM and STM , LDRD, RFE , SRS , STRD, SWP PUSH, except for encodings T3 and A2
POP , except for encodings T3 and A2
字
对齐错误
对齐错误
LDC , LDC2, STC , STC2
字
对齐错误
对齐错误
VLDM, VLDR, VPOP, VPUSH, VSTM, VSTR
VLD1, VLD2, VLD3, VLD4, VST1, VST2, VST3, VST4, all with standard alignment
a
单位尺寸
非对齐访问
对齐错误
VLD1, VLD2, VLD3, VLD4, VST1, VST2, VST3, VST4, all with @<align> specified
a
@<align>指定
对齐错误
对齐错误
A3.2.2导致非对齐访问不可预知的事件
下述的事件导致非对齐访问的不可预知性,并且拒绝或者允许加载、存储行为展示在表3-1(106页)。
l 任何没有错误的通过对齐指令的(表3-1中)加载命令,和加载PC指针都有不可预知行为,如果地址加载它的时候不是字对齐的。
l 不包括虚拟扩展的执行中,任何通过对齐指令(表3-1)触发的没有错误的的非对齐的访问和严格顺序的内存访问或者设备内存属性都有不可预知行为。
-----------------------注意--------------------------------------------------
------在一个包含虚拟扩展的操作中,一个不对齐的访问到顺序内存或者设备的将产生一个对齐错误。查看对齐错误B3-1393页。
-----内存模型、属性和内存序列模型(A3-123页)描述了强序列和设备内存属性。
-------------------------------------------------------------------------------
A3.2.3ARMV7和ARMV6的不对齐数据访问限制
ARMv7和ARMv6在非对齐数据访问中有如下限制。
l 访问不确保是原子操作除非为字节访问水平,查看原子操作在ARM架构(A3-125页)。在共享内存系统中一个访问能够合成一系列的对齐操作。
l 非对齐访问与自然对齐转换相比,会多花一些额外的周期。为了更好的执行操作,一个实时指令必须被仔细分析并且关键数据结构也许也需要适应他们的对齐格式。
l 执行一个非对齐访问的操作能导致任意内存访问中断,并且能够中断不仅一个访问。意味着在也边界的任意的非对齐访问能够中断任意一个边界,也能够中断两个边界。