在指令集级别上防止未对齐的访问

问题描述 投票:1回答:1

是否存在使用非字节地址防止未对齐访问的指令集?

据我所知,大多数体系结构在任何地方都使用字节地址,但是会对未对齐的访问进行惩罚或抛出异常。

例如,在指令级别上防止这种情况有意义吗?用于存储字节的bstr使用字节地址,dstr使用字地址存储字,qstr使用四地址存储四元组,等等?因此,没有例外也没有惩罚,而且作为奖励,它甚至可以扩大可访问存储空间的范围(否则,浪费了较低的位)。

据我所发现的x86,ARM,Alpha,Itanium等,它们始终使用字节寻址,但要求用户确保某些指令仅与对齐的地址一起使用,从而导致运行时异常/惩罚,而不是“静态”以避免这种情况,方法是使用与所讨论类型兼容的地址。

我错过了什么吗?还是有很深的理由喜欢这种方式(例如简化编译器)?

assembly cpu-architecture memory-address memory-alignment instruction-set
1个回答
0
投票

有一些字寻址机器,包括一些现代DSP。但是它们仍然只有一个“标度”用于地址,地址空间的任何部分都不是字节可寻址的。

还是有很深的理由更喜欢这种方式(例如,简化编译器)?

是,有。如果要在将数组用于bool数组或char字符串数组之前对其进行有效的调零,则8字节甚至更大的SIMD存储区可能会发生调零。 使用相同地址,将用于对相同数据进行字节访问。这只是一个例子。

[使用一个更大的负载或存储以在struct的多个元素周围复制也很常见。说到哪个,结构如何工作?通常,您为该结构的基址有一个地址,并且可以从该地址以固定的偏移量访问任何成员。对于您的方案,是否需要右移地址以撤消qld的隐式左移?


而且,像malloc这样的内存分配器可以使用相同的地址,而不管其调用者希望如何使用该内存。您是否必须将地址缩放(通过移位)回到标准尺寸free

对于相同的存储单元具有多个地址是“混淆”,并且容易引起问题。

或者您正在想象字节地址空间与qword地址空间完全不相交?如果是这样,您如何有效地将数据从一个复制到另一个而又不能一次存储多个字节?也许每个地址空间都可以使用SIMD加载/存储?

或者是底部的4GiB存储器是字节可寻址的(以及word,dword和qword),而高于4G的8GiB范围只能寻址为16位或更宽的块?上面的下一个8GiB只能用作32位块吗? (dstr地址范围的上半部分)。等

[如果是这样,是否为每个大小都有一个单独的malloc分配器,所以如果您需要可按字节访问的内存,则将其限制为低4GiB(32位bstr地址= 32的低29位-bitqstraddress-space?),因为您有一些不可访问的内存,不能用作字节。 qstr地址空间可以认为是隐式左移3以创建一个8位对齐的35位字节地址。]

这听起来确实很难处理,或者至少不适合软件所使用的标准模型,并且已经包含在C之类的语言中。使用诸如分段之类的机制来扩展您的地址会更加正常,统一间隔,以便您可以将其用于字符串,字节数组等。

我想虚拟内存仍然可以在固定大小的物理页面方面工作,并且操作系统可以使用那些4k页面之一来支持有效的35位虚拟地址空间中的任何虚拟页面。但这意味着qstr的页面边界只有4096/8 = 512个qword地址大。

((在这些示例中,我假设寄存器宽度为32位。如果您具有64位寄存器,则不需要任何不便技巧来扩展地址空间,只需使用字节地址即可。)

© www.soinside.com 2019 - 2024. All rights reserved.