虚拟内存以及它们是如何结合在一起的

Virtual memory and how do they factor together?

本文关键字:结合 在一起 何结合 虚拟内存      更新时间:2023-10-16

我想我理解内存对齐,但让我困惑的是,指针的地址在一些系统将是在虚拟内存,对吗?所以我所看到的大多数检查/确保对齐似乎只是使用指针地址。物理内存地址不可能对齐吗?这对上交所这样的公司来说不是问题吗?

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

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

在SSE的特定情况下,一切都很好,因为您只需要16个字节对齐。

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

通常,给定平台上的所有对齐都是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块时才会出现问题。但即使这样,通常设备也不会坚持大于页面大小的对齐方式。