【问题标题】:Linux page allocationLinux页面分配
【发布时间】:2013-08-31 13:37:10
【问题描述】:

在 linux 中,如果 malloc 无法从预先分配的页面分配数据块。它使用 mmap() 或 brk() 分配新页面。我想澄清一些事情:

  1. 我不明白下面的陈述,我认为当我使用 mmap() 或 brk() 时,内核会映射我一整页。但是分配器只分配我从那个新页面中要求的内容?在这种情况下尝试访问未分配的空间(在新映射的页面中)会不会导致页面错误? (我知道不推荐)

libc 分配器管理每个页面:将它们分割成更小的块,将它们分配给进程,释放它们等等。例如,如果您的程序总共使用 4097 字节,则您需要使用两个页面,即使实际上分配器为您提供了 4105 到 4109 字节之间的某个位置

  1. 分配器如何知道 VMA 边界?(我假设没有使用系统调用)因为保存该信息的 VMA 结构只能从内核模式访问?

【问题讨论】:

    标签: memory-management linux-kernel mmap


    【解决方案1】:

    系统级内存分配(通过mmapbrk)都是页面对齐和页面大小的。这意味着如果您使用 malloc(或其他分配内存的 libc API)少量内存(例如 10 个字节),则可以保证该内存页上的所有其他字节都是可读的,而不会触发页面错误。

    Malloc 和家族在从操作系统返回的页面中进行自己的记账,因此除了您分配的任何空间之外,libc 使用的 mmap 页面还包含一堆 malloc 元数据。

    libc 分配器知道所有内容的位置,因为它调用了brk()mmap() 调用。如果它调用mmap(),它传入一个大小,内核返回一个起始地址。然后 libc 分配器将这些值存储在其元数据中。

    Doug Lea 的 malloc 实现是一个非常、非常有据可查的内存分配器实现,它的 cmets 将阐明分配器的一般工作原理: http://g.oswego.edu/dl/html/malloc.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 2018-03-22
      • 2011-01-28
      • 2014-04-24
      相关资源
      最近更新 更多