当用户空间应用程序调用时
malloc(),该调用未在内核中实现。相反,它是一个库调用(实现的glibc或类似方法)。
简短的版本是
mallocglibc 中的实现要么通过
brk()/
sbrk()system调用获取内存,要么通过
mmap()。这为glibc提供了一个很大的连续(相对于虚拟内存地址)的内存块,该
malloc实现将实现进一步切成小块并将它们切成小块,然后分发给您的应用程序。
这是一个小
malloc实现,它将为您提供想法,以及许多链接。
请注意,还没有什么东西在乎物理内存-当通过
brk()/
sbrk()或更改过程数据段
mmap(),以及在引用内存(通过对内存的读取或写入)时,内核虚拟内存系统会处理该内存。
总结一下:
malloc()
将搜索其托管的内存,以查看是否有一块满足分配要求的未使用的内存。- 如果失败,
malloc()
将尝试扩展过程数据段(通过sbrk()
/brk()
或在某些情况下mmap()
)。sbrk()
最终进入内核。 - 内核中的
brk()
/sbrk()
调用会调整struct mm_struct
流程中的某些偏移,因此流程数据段会更大。首先,将没有物理内存映射到扩展数据段所提供的其他虚拟地址。 - 当第一次触摸到未映射的内存时(可能是实现的读/写操作
malloc
),故障处理程序将启动并进入内核,在内核中内核将为未映射的内存分配物理内存。



