跨内存页的数据会发生什么?

What happens to data across memory pages?

假设我们有 64 字节的页面。在虚拟内存space中,在[0, 4)处分配了一个4字节的int,我们现在要分配一个10double的数组。例如,如果 malloc 决定将数组放在 [4, 84),就会有一个 double 跨越第 0 页和第 1 页 [60, 68)。当我们尝试访问该元素时会发生什么?

简答:CPU 将读取此值。

长答案:我们需要澄清几个假设:

  1. 我们在谈论什么 CPU 架构?一些架构(如 x86 和 x64)可以对未对齐的值进行操作,而另一些架构(如 ARM)则不能。这意味着只能在 N * sizeof(primitive-value-type) 的地址访问 ARM 中的值,其中 N 是整数。内存管理函数和编译器知道这一点,因此它们会自动对齐这些平台上的分配。
  2. 内存管理函数本身使用一些内存来进行内务处理。这意味着应用程序不会像问题描述的那样看到连续的分配。根据所使用的确切堆管理器,第一次分配将是远离 0 的几个指针大小,下一次分配将 return 第一次分配结束后至少几个指针大小的地址。
  3. 只要满足上述条件,跨页读取对应用程序来说是完全透明的。处理器在后台进行线性->物理地址转换,并在需要将页面拉入物理内存时回调 OS 。但这不是应用程序(通常)可以而且应该知道的事情。
  4. 其他人可能会考虑 64 字节页面。我不知道页面小于 4kB 的平台,但我假设所讨论的 64 字节页面大小仅用于演示目的。

页边界只对内存分配和逻辑地址转换有意义。应用程序看不到页面边界(分配页面时除外)。应用程序看到的只是一个连续的逻辑地址 space.