【问题标题】:Virtual memory and alignment - how do they factor together?虚拟内存和对齐 - 它们如何组合在一起?
【发布时间】:2012-01-01 18:07:06
【问题描述】:

我想我理解内存对齐,但令我困惑的是,某些系统上的指针地址将位于虚拟内存中,对吧?所以我见过的大多数对齐检查/确保似乎只是使用指针地址。难道物理内存地址不会对齐吗?这对 SSE 之类的东西来说不是问题吗?

【问题讨论】:

  • 我不是低级内存模型(包括对齐)方面的专家。但我认为页面会对齐,我认为这会使这些页面中的任何相对指针自动对齐。
  • 是的,听起来我不明白的是虚拟内存。

标签: c++ alignment virtual-memory


【解决方案1】:

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

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

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

请注意,您可能有理由不时要求比页面更大的对齐方式。通常,对于用户空间编码,它是否在物理 RAM 中对齐并不重要(就此而言,如果您请求多个页面,它甚至不太可能是连续的!)。只有在编写设备驱动程序并且需要一个大的、对齐的、连续的块用于 DMA 时,才会出现这里的问题。但即便如此,通常该设备也不会严格遵守大于页面大小的对齐方式。

【讨论】:

  • 实际上,x86 上可能需要对齐的最大数据类型目前是 32 字节——对于 AVX。在其他情况下,您可能会要求对齐 > 32 字节 - 要求动态分配是页面对齐的情况并不少见。
【解决方案2】:

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

因此,除非您需要对齐 > 页面大小,否则物理内存将根据您的要求对齐。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多