zoukankan      html  css  js  c++  java
  • Chap-6 6.4.2 堆和栈

    6.4.2 堆和栈
    在操作系统里面,VMA除了被用来映射可执行文件中的各个segment,操作系统还使用VMA来对进程的地址空间
    进行管理。进程在执行的时候还需要用到堆(heap)和栈(stack)等空间,一个进程中的栈和堆分别都有一个
    对应的VMA,在Linux下,可以通过/proc来查看进程的虚拟空间分布,下面查看一个死循环的虚拟空间分布:


    ***图6.4.2***
    第一列是VMA的地址范围;第二列是VMA的权限,“p”表示私有(COPY ON WRITE,COW),“s”表示共享;第三列
    表示VMA对应的segment在文件中的偏移;第四列表示映像文件所在设备的主设备和次设备号;第五列表示
    映像文件的节点号(inode);最后一列表示映像文件的路径。我们用ll命令查看该ELF可执行文件的inode号,
    如图6.4.3所示:


    ***图6.4.3***
    第一列即是该ELF文件对应的inode号码,这个号码和图6.4.2中第五列的inode号码相同。

    从图6.4.2中可以看出,只有前两个是映射到可执行文件的segment,另外4个segment所在的主设备和次设备号
    都是0,表示它们没有映射到文件中,这种VMA叫做匿名虚拟内存区域(Anonymous Virtual Memory Area)。其中
    的两个segment是堆(heap)和栈(stack),函数是从堆里面分配的,堆由系统库管理。

    ELF可执行文件将相同权限属性的section映射到同一个segment,一个segment对应一个VMA。操作系统通过VMA来
    管理进程的虚拟地址空间,一个进程基本上可以分为如下几种VMA区域:
    代码VMA:权限只读、可执行;有映像文件
    数据VMA:权限可读写、可执行;有映像文件
    堆VMA:权限可读写、可执行;无映像文件,匿名,可向上扩展
    栈VMA:权限可读写、不可执行;无映像文件,匿名,可向下扩展

  • 相关阅读:
    JZOJ5809 数羊
    P3313 [SDOI2014]旅行
    2019.10.22 NOIP模拟测试 day2
    P4322 [JSOI2016]最佳团体
    P1850 换教室
    P3225 [HNOI2012]矿场搭建
    P2607 [ZJOI2008]骑士
    2019.10.21 NOIP模拟测试 day1
    AFO
    禁止加载浏览器图片
  • 原文地址:https://www.cnblogs.com/miaoyong/p/3514600.html
Copyright © 2011-2022 走看看