【问题标题】:Linux kernel memory management, does it use consecutive memory pages all the time?Linux内核内存管理,它是否一直使用连续的内存页面?
【发布时间】:2012-07-23 15:15:24
【问题描述】:

Linux内核是否连续分配内存,例如从malloc?如果没有大的部分可用,但较小的部分可以作为一个整体工作,Linux 会使用它吗?

【问题讨论】:

  • 是从内核内部的角度来看的问题(与内核驱动程序内部的kmalloc有关),还是从用户级应用程序向内核请求内存的角度来看(使用@ 987654324@和相关的系统调用,用于实现malloc)?
  • @BasileStarynkevitch 来自内核端,因为我不确定 malloc 是否真的调用 kmalloc,所以我在这里使用了malloc

标签: linux memory-management kernel


【解决方案1】:

我假设在问题中,“连续”是指物理内存。

您在进程执行时看到的所有地址,例如当您使用gdbaddr2line 时,都是虚拟地址。到物理内存的映射仍在后台。

malloc 通常不是系统调用。它是特定平台系统调用(例如mmapbrk)的包装器。当被进程调用时,会导致调用进程的内存被扩展。

例如,malloc(40960) 可以请求 10 页内存,假设页面大小为 4KB。 Memory Management Unit (MMU) 不会立即在物理内存中分配 10 页。相反,新条目(在本例中为 10 个)被添加到调用进程的地址空间中,也就是说,新条目被添加到该进程的 页表 中。此虚拟内存将是连续的。

现在假设在稍后的执行过程中,进程尝试使用这个新分配的内存,此时,由于进程触及了未分配的内存,因此调用了页面错误。然后 MMU 将在 RAM 中分配一个实际的物理页(4096 个连续字节),更新页表并恢复进程的执行。

所以我们唯一可以确定的是,40960 字节中的 4096 字节(一页)在物理内存 (RAM) 中是连续的,尽管整个 40960 字节(10 页)在虚拟内存中显示为连续的。这 10 个页面中的任何一个或所有页面都可以映射到分散在 RAM 中的页面。

虚拟内存隐藏了这一点,并为进程提供了一个干净、连续的空间。 MMU 使用页表通过将虚拟内存映射到物理内存来提供后端支持。

【讨论】:

  • 今天malloc 经常使用mmap(2) 系统调用向内核请求虚拟内存; sbrk(2)brk(2) 几乎已过时。有时free 使用munmap(2) 系统调用释放内存,但大多数时候它只是组织释放的内存区域以供进一步malloc 重用。使用strace 找出真正完成了哪些系统调用。
【解决方案2】:

在 linux 内核中,内存分配是使用 kmalloc 或 vmalloc 完成的。 kmalloc 分配物理上连续的内存,而 vmalloc 分配物理上不连续的内存。 kmalloc 和 vmalloc 都会为您提供连续的虚拟内存空间。这是使用页表完成的。

【讨论】:

    【解决方案3】:

    我相信使用 malloc() 分配内存的物理映射可能是不连续的,这确实是操作系统的责任。它可能是连续的,也可能不是连续的。

    想到一个名为 kmalloc() 的函数,如果可用,它将分配连续的“物理”内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 2013-11-14
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      相关资源
      最近更新 更多