Linux页面分配

时间:2013-08-31 13:37:11

标签: memory-management linux-kernel mmap

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

Doug Lea的malloc实现是一个非常详细记录的内存分配器实现,它的评论将大大阐明分配器如何工作: http://g.oswego.edu/dl/html/malloc.html