32 Bit RAM中的内存对齐问题:为何地址1无法存储2 Byte数据包
非对齐2字节内存访问问题解答
首先澄清一个常见误区
不存在全平台通用的“完全无法在地址1存储2字节数据”的限制,不同架构的处理规则完全不同:
- x86这类CISC架构原生支持非对齐内存访问,你完全可以正常在地址1存储、读取2字节数据,仅在部分跨块访问的场景下会有性能下降
- 只有MIPS、早期ARM这类追求硬件精简的RISC架构,才会默认触发非对齐访问异常,直接禁止这类操作
你推导的逻辑漏洞
你对32位内存bank的工作逻辑的理解缺少了内存控制器和指令集的硬件约定前提:
- 32位内存控制器的单次读取默认以对齐的4字节块为基础单位,地址的低2位仅用于块内的偏移选择,不会用来做跨块的选址。你提到的地址1处的2字节数据确实完全落在
0x0 ~ 0x3这同一个4字节块内,从存储介质的角度确实单次读取就能拿到所有原始数据。 - 严格要求对齐的RISC架构为了压缩硬件复杂度、提升主频,砍掉了块内非对齐数据的移位、字节拼接电路:指令集直接约定n字节访问的地址必须满足
m mod n == 0,硬件只会从给定地址的偏移起始直接输出连续n字节,不会额外做数据拼接的工作,只要地址不符合规则就直接抛出异常,根本不会去判断数据是不是在同一个块内。
补充性能说明
哪怕是支持非对齐访问的x86架构,非对齐访问也存在明显的性能隐患:如果你要访问的2字节数据地址是0x3,那数据会分别落在0x0 ~ 0x3和0x4 ~ 0x7两个不同的4字节对齐块中,此时必须发起两次内存读取,再拼接出需要的2字节数据,耗时至少是对齐访问的2倍。
这也是为什么编译器、操作系统默认都会做内存对齐处理,哪怕架构支持非对齐访问,也会尽可能避免这种情况出现。
内容的提问来源于stack exchange,提问作者freezeling
相关产品推荐
相关产品推荐

