malloc
malloc实际上是一个C语言库函数,有一套自己的内存管理方式,包括分配、释放和合并等动作。用户调用malloc后,malloc会进行一系列动作,最终返回一个虚拟地址出来。
我们知道malloc是申请堆的内存,当malloc调用时,会在堆里寻找一段空闲的足够大的内存空间,直接返回。如果当前已经找不到足够大小的空闲空间,那么malloc会通过系统调用brk申请扩展堆的空间,从而得到新的内存空间。
进程地址空间
与进程地址空间有关的全部信息都存放在内存描述符mm_struct里,由进程描述符的mm字段指向。相关结构体信息如下:
进程的内存布局大致如下图所示,malloc所申请的内存就是存放在堆(heap)里,堆的大小由内存描述符的start_brk和brk字段限定。
线性区
因为进程地址空间中存在多个段,不同段之间有可能不连续,而且访问权限也不相同,所以需要用一种方式将其管理起来。Linux通过一种名为线性区(memory region)的数据结构管理,类型为vm_area_struct,线性区所指向的是一段连