通过《Linxu进程的内存管理》,我们知道了进程内存的最小单位是vma,根据不同的用处又划分了不同类型的vma,比如
- heap: 动态分配和释放的内存
- stack: 存放局部变量和实现函数调用
- mmap:文件区间映射到虚拟地址空间的内存映射
- text,data,bss
这篇我们就看下进程动态申请的内存,我们知道进程动态申请内存的函数是malloc,这篇讲下其涉及到的vma,即heap和mmap。
malloc
在linux标准libc库种,malloc函数的实现会根据分配内存的size来决定使用哪个分配函数,当size小于等于128KB时,调用brk分配;当size大于128KB时,调用mmap分配内存。size可由M_MMAP_THRESHOLD选项调节。如下图:
图片
- sys_brk分配过过程主要是调整brk位置
- sys_mmap分配过程中主要是在堆和栈中间(memory mapping segment)找一段空闲的虚拟内存
图片
brk
堆内存是由低地址向高地址方向增长。分配内存时,将h