linux进程地址空间分段和C语言内存分区对比

linux进程程序分段

  • linux系统针对每个进程都存在一个内存地址划分

  • 一个进程通常由加载一个elf文件启动,而elf文件由多个segments组成。同样的,进程地址空间也由许多不同属性的segments组成

  • linux的segment是虚拟地址空间中用于保存数据区域,只在虚拟地址上连续

  • segment

    • text段(代码段) 包含了当前运行进程的二进制代码
    • data段(数据段) 存储已经初始化的全局变量
    • bss段 存储未初始化的全局变量
      • 这三个段是紧紧挨在一起的,因为三者大小确定 不会动态变化
    • heap段() 储存动态分配的内存中的数据
    • stack段() 保存局部变量和实现函数/过程调用的上下文
      • 大小都是会在运行过程中变化,因此二者中间留有空隙 谁多谁就多占用间隙部位
    • mmap() 特殊段 mmap段的大小也是不确定的
      • heap段, stack段,mmap段在动态增长的过程还是有重叠(碰撞)的可能,64位系统则不存在
  • 加载顺序

    • 首先execve()执行elf,可执行文件的text段,data段,stack段就建立了
    • 在进程运行过程中,可能需要借助ld.so加载动态链接库,比如最常用的libc,则libc.sotext段,data段也建立了
    • 而后可能通过mmap()的匿名映射来实现与其他进程的共享内存,还有可能通过brk()来扩大heap段的大小

C语言程序内存五大分区

  • C语言程序经过编译变成可执行elf程序,某种程度上是二者是可以对应的
  • 分区
    • 栈区 存放函数的参数值,局部变量的值等。
    • 堆区 由程序员手动开辟和释放的内存(malloc/new)
    • 全局区(静态区)(static) 存放全局变量和静态变量
      • 初始化的全局变量和静态变量在一块区域
      • 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域
    • 文字常量区 存放常量字符串
    • 程序代码区 存放二进制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值