堆概述
堆简介
堆是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长,用来提供动态分配的内存(用户申请时启用)。只有虚拟地址被真正使用时才会与物理地址形成映射关系。
堆管理器
管理堆的程序,介于用户与系统内核之间。响应用户请求向系统申请内存,一次会申请很大内存,根据用户需求分配堆,堆空间不够时才会再次与系统交互;用户释放内存后内存先有堆管理器管理,不直接返回系统。
堆的申请与释放
相关函数
malloc和free
malloc(size) : 用户通过malloc函数申请size大小的堆内存,malloc 函数返回对应大小字节的内存块的指针
free(ptr) : 用户通过free函数释放相应指针指向的堆内存
brk()和sbrk()
malloc和free后面真正与系统进行交互的函数时brk()和sbrk(),还有mmap、unmmap等
堆的大小通过brk()和sbrk()函数移动program_break使堆增长。
brk(ptr):参数是一个指针,用于设置program_break指向的位置
sbrk(increment):参数与program_break相加来调整program_break的值
执行成功brk()返回0,sbrk()返回上一次program_break的值
初始时,堆的起始地址 start_brk 以及堆的当前末尾 brk 指向同一地址。
不开启 ASLR 保护时,start_brk指向 data/bss 段的结尾。
开启 ASLR保护时,start_brk 指向data/bss 段结尾后的随机偏移处。