虚拟内存和对齐 - 它们如何组合在一起?

时间:2011-11-19 02:57:12

标签: c++ alignment virtual-memory

我想我理解内存对齐,但令我困惑的是,某些系统上指针的地址将在虚拟内存中,对吧?因此,我所看到的大多数检查/确保对齐似乎只是使用指针地址。物理内存地址不可能不对齐吗?这对SSE这样的问题不是很有问题吗?

2 个答案:

答案 0 :(得分:8)

物理地址将被对齐,因为虚拟内存仅将对齐的页面映射到物理内存(页面通常为4KB)。

所以除非你需要对齐>页面大小,物理内存将根据您的要求对齐。

在SSE的特定情况下,一切正常,因为您只需要16字节对齐。

答案 1 :(得分:4)

我不知道任何实际的系统,其中对齐的虚拟内存地址可能导致未对齐的物理内存地址。

通常,给定平台上的所有对齐都是2的幂。例如,在x86上,32位整数具有4个字节(2 ^ 2)的自然对齐。页面大小 - 定义了可以在物理内存中映射的块的精细程度 - 通常是 2的幂。在x86上,允许的最小页面大小为4096字节(2 ^ 12)。可能需要在x86上对齐的最大数据类型是 128位(对于XMM寄存器和CMPXCHG16B) 32字节(对于AVX) - 2 ^ 5。由于2 ^ 12可被2 ^ 5整除,因此您会发现所有内容都在页面的开头对齐,并且由于页面在虚拟和物理内存中都是对齐的,因此虚拟对齐的地址始终是物理对齐的。

在更实际的层面上,允许对齐的虚拟地址映射到未对齐的物理地址不仅会使生成代码变得非常困难,还会使CPU架构更复杂而不是简单地允许任何对齐(因为现在我们有奇怪的页面和其他奇怪...)

请注意,您可能有理由不时要求比页面更大的路线。通常,对于用户空间编码,如果它在物理RAM中对齐并不重要(就此而言,如果您要求多个页面,则它不太可能是连续的!)。只有在编写设备驱动程序并且需要一个大的,对齐的,连续的DMA块时,才会出现问题。但即便如此,通常该设备并不是关于大于页面大小对齐的坚持者。