2011-11-19 56 views
5

我想我理解内存对齐方式,但是让我困惑的是某些系统上的指针地址会在虚拟内存中,对吗?因此,我所看到的大多数校验/确保校准似乎只是使用指针地址。物理内存地址不可能对齐吗?对于像SSE这样的事情,这不是问题吗?虚拟内存和对齐 - 它们如何分解?

+1

我不是低级别内存模型(包括对齐)的专家。但我会认为页面会对齐,我会假设这些页面中的任何相对指针会自动对齐。 –

+0

是的,这听起来像我不明白的是虚拟内存。 –

回答

8

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

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

在SSE的具体情况下,一切正常,因为你只需要16字节对齐。

4

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

通常情况下,给定平台上的所有路线都是2的幂。例如,在x86上,32位整数具有4个字节(2^2)的自然对齐。页面大小 - 它定义了您可以在物理内存中映射块的程度如何 - 通常是两个幂的大小。在x86上,最小允许页面大小为4096字节(2^12)。可能需要在x86上对齐的最大数据类型是 128位(对于XMM寄存器和CMPXCHG16B) 32字节(对于AVX) - 2^5。由于2^12可以被2^5整除,因此您会发现所有内容都在页面的开头对齐,并且由于页面在虚拟内存和物理内存中都是对齐的,所以虚拟对齐地址将始终是物理对齐的。在更实际的层面上,允许对齐的虚拟地址映射到未对齐的物理地址不仅会使得它很难生成代码,它还会使CPU架构比简单地允许任何对齐更复杂(因为现在我们有奇怪的大小页面和其他奇怪的......)

请注意,您可能有理由要求比页面不时更大的路线。通常情况下,对于用户空间编码而言,这是否与物理内存对齐并不重要(就此而言,如果您请求多个页面,则不太可能连续!)。如果你正在编写一个设备驱动程序,并且需要一个大的,对齐的,用于DMA的连续块,这里才会出现问题。但即使如此,通常这款设备并不是一款超过页面大小的标准。

+0

实际上,可能需要x86对齐的最大数据类型目前是32字节 - 对于AVX。还有其他情况下,您可能会请求对齐> 32个字节 - 请求动态分配页面对齐并不罕见。 –