【问题标题】:Linux page allocationLinux页面分配
【发布时间】:2013-08-31 13:37:10
【问题描述】:
在 linux 中,如果 malloc 无法从预先分配的页面分配数据块。它使用 mmap() 或 brk() 分配新页面。我想澄清一些事情:
- 我不明白下面的陈述,我认为当我使用 mmap() 或 brk() 时,内核会映射我一整页。但是分配器只分配我从那个新页面中要求的内容?在这种情况下尝试访问未分配的空间(在新映射的页面中)会不会导致页面错误? (我知道不推荐)
libc 分配器管理每个页面:将它们分割成更小的块,将它们分配给进程,释放它们等等。例如,如果您的程序总共使用 4097 字节,则您需要使用两个页面,即使实际上分配器为您提供了 4105 到 4109 字节之间的某个位置
- 分配器如何知道 VMA 边界?(我假设没有使用系统调用)因为保存该信息的 VMA 结构只能从内核模式访问?
【问题讨论】:
标签:
memory-management
linux-kernel
mmap
【解决方案1】:
系统级内存分配(通过mmap 和brk)都是页面对齐和页面大小的。这意味着如果您使用 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