首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储器地址对齐

存储器地址对齐
EN

Stack Overflow用户
提问于 2012-04-05 04:36:50
回答 1查看 2.7K关注 0票数 5

我对内存对齐的概念有点困惑。这就是我的疑问:文本所说的是,如果你想读取4个字节的数据,从一个不能被4整除的地址开始,你有一个未对齐的内存访问的情况。例如,如果我想读取从地址05开始的10个字节,这将被称为未对齐访问(http://www.mjmwired.net/kernel/Documentation/unaligned-memory-access.txt)。

这种情况是否特定于4字节字寻址体系结构,或者这对于字节可寻址体系结构也是有效的?如果上面的情况对于字节可寻址体系结构是不对齐的,为什么会这样?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-04-05 09:17:24

对齐与数据大小和寻址有关。大多数指令集/软件的寻址是以字节为单位的。0、1、2、3都是有效的字节地址。假设你正在访问的存储系统或外设是“字节可寻址的”,基本上你可以向它写入单独的字节,你通常有允许你使用任何地址值的指令。当你有超过一个字节,两个字节时,对齐就开始了,如果对齐意味着地址的lsbit是0,未对齐意味着它是1。四个字节,32位数量,较低的两位是零,对齐,一个或两个都不是零,未对齐,等等。可以认为它是你想要的模数地址,其中模数4=0在4字节边界上对齐。

现在,作为一名软件工程师,通常您不会故意将自己放在需要在地址5处获取10个字节的情况下,您可能会在0x4处获取12个字节,或者在0x0处获取16个字节,或者沿着这些线做一些事情,即使您只使用其中的10个字节,您也会更合理地对齐它们。外部影响、网络数据包、文件系统、共享内存、硬件等,任何时候当您跨越编译域时,您可能都必须处理这些问题并采取相应的行动。10字节是否是半有趣的取决于你是试图将这些字节复制到另一个同样糟糕的地址,还是仅仅读取或写入它们。如果读取数据,您可能只想读取地址0x4处的12个字节,然后将其读完。如果写得好,你可以在一个很好的循环中完成所有的10,或者一次展开一个字节,你可以在0x5写一个,在0x6写两个,在0x8写四个,在0xC写两个,在0xE写一个,或者在0x5写一个,从0x6开始循环或展开4个16位值,然后在0xE写一个字节。等。

既然你说过读取,你可以读取0x4的3个32位的量,或者从0x0开始的两个64位的量。这在很大程度上取决于你计划对数据做什么,以及你正在使用什么指令集,等等。10字节读取的循环可能是最干净/最简单的读取、维护等。

如果你想知道对齐还是不对齐,那么就像我上面提到的写操作一样,你可以做一个

代码语言:javascript
复制
8 bit access at 0x5
16 bit access at 0x6
32 bit access at 0x8
16 bit access at 0xC
8 bit access at 0xE

不过,正如我一直说的,对于读取来说,这可能不是最有效的。对于写入,您可以以32位或64位的数量或我上面提到的组合进行读-修改-写。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10018855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档