跨内存页面的数据会怎样?

时间:2018-11-29 17:35:33

标签: memory memory-management operating-system cpu

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

2 个答案:

答案 0 :(得分:0)

简短答案:CPU将读取该值。

好答案:我们需要澄清一些假设:

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

答案 1 :(得分:0)

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