随笔小屋 Logo
首页
瞬间
反馈
随笔小屋 Logo
首页 瞬间 反馈
  1. 首页
  2. linux
  3. 虚拟内存

虚拟内存

  • linux
  • 发布于 2025-09-16
  • 192 次阅读
flor
flor
内存区域名称 存储内容
参数和环境区 命令行参数和环境变量
栈区(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

湘ICP备2025147565号-1
gongan beian 湘公网安备43102602000213号
CPU --% | 内存 0.00G/0.00G (0%) | 网络 无活动网卡
服务器资源占用 更新时间 --:--:--