| 内存区域名称 | 存储内容 |
|---|---|
| 参数和环境区 | 命令行参数和环境变量 |
| 栈区(stack) | 非静态局部变量 |
| 堆栈增长预留空间、共享库、共享内存等 | (此区域本身,无对应存储内容说明) |
| 堆区(heap) | 动态内存分配 |
| BSS区(bss) | 未被初始化的全局和静态局部变量 |
| 数据区(data) | 不具常属性且被初始化的全局和静态局部变量 |
| 代码区(text) | 可执行指令、字面值常量、具有常属性且被初始化的全局和静态局部变量 |
建立映射
#include <sys/mman.h>
void* mmap(void* start, size_t length, int prot, int flags,int fd, off_t offset);
功能:建立虚拟内存到物理内存或磁盘文件的映射
参数:start:映射区虚拟内存的起始地址,NULL时系统自动选定起始地址
length:映射区字节数,自动按页取整
prot:映射区操作权限,取以下值,按位或多选
PROT_READ 映射区可读
PROT_WRITE 映射区可写
PROT_EXEC 映射区可执行
PROT_NONE 映射区不可访问
flags:映射标志取以下值
MAP_ANONYMOUS 匿名映射,将虚拟内存映射到物理内存而非文件,忽略fd和offset参数
MAP_PRIVATE 对映射区的写操作只反映到缓冲区中并不会真正写入文件
MAP_SHARED 对映射区的写操作直接反映到文件中
MAP_DENYWRITE 拒绝其他对文件的写操作
MAP_FIXED 若在start上无法创建映射,则失败(系统自动调整)
fd:文件描述符
offset:文件偏移量,自动按页(4k)对齐
返回值:成功返回映射区虚拟地址的起始地址,失败返回MAP_FAILED(-1)解除映射
#include <sys/mman.h>
int munmap(void* start, size_t length);
功能:解除虚拟内存到物理内存或磁盘文件的映射
参数:start:映射区虚拟地址的起始地址
length:映射区字节数,自动按页取整
返回值:成功返回0,失败-1
munmap允许解除部分映射,需按页处理分配和释放
#include <unistd.h>
void* sbrk(intptr_t increment);
功能:以相对方式分配和释放虚拟内存
功能:increment 堆内存的字节增量(字节为单位)
>0 分配内存
<0 释放内存
=0 当前堆尾
返回值:成功返回调用该函数前的堆尾指针,失败-1
int brk(void* end_data_segment);
功能:以绝对方式分配和释放虚拟内存
参数:end_data_segment 堆尾指针的目标位置
> 堆尾指针的原位置 分配内存
< 堆尾指针的原位置 释放内存
= 堆尾指针的原位置 空操作
返回值:成功0,失败-1