Linux系统--进程地址空间之存储器区域

来源:互联网 发布:惠普手机打印软件 编辑:程序博客网 时间:2024/06/07 19:32

    上篇文章简单介绍了虚拟地址及其页面的知识,本篇更进一步概述页面的分类。
    Linux系统内核将具有某些相同特征(例如读写权限)的页组织成块(blocks)。这些块叫做存储器区域(memory regions)段(segments),或者映射(mappings),对进程而言,可见的存储器区域主要有:
    ·文本段(text segment),存储进程的代码,字符串,常量和一些读的数据。Linux系统将其标记为只读,并且直接从目标文件(可执行程序或库文件)映射到内存中。
    ·堆栈段(stack segment),包含一个进程的执行栈,随栈的深度动态的伸长或收缩。执行栈包含了程序的局部变量(local variables)和函数的返回值
    ·堆(heap),包含了一个进程的动态存储空间。这个段是可写的,而且是大小可变的。这部分空间往往由malloc(new)等函数分配的。
    ·数据段(data segment),通常指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
    ·BSS段(bss segment),Block Started by Symbol,包含了没有被初始化的全局变量。这些变量根据不同的C标准都有特殊的默认值(通常为0)


BSS段和data段的区别:
    bss段(未手动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的大小(记录在段表中)。
    data段(已手动初始化的数据)段则为数据分配空间,数据保存在目标文件中(占实际空间)。

    数据段包含经过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到 ,然后链接器得到这个大小的内存块,紧跟在数据段后面。当这个内存区进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。

0 0
原创粉丝点击