• C程序内存区域分配(5个段作用)


    参考:
    http://www.360doc.com/content/11/0330/21/1317564_105977930.shtml
    http://hi.baidu.com/bitcore/blog/item/77c521c65f4512d7d10060eb.html
    http://apps.hi.baidu.com/share/detail/22734757
    http://my.oschina.net/alphajay/blog/3870

    一、C语言可执行代码结构

     名称

    内容

    代码段

     可执行代码、字符串常量

    数据段

     已初始化全局变量、已初始化全局静态变量、局部静态变量、常量数据

    BSS

     未初始化全局变量,未初始化全局静态变量

     局部变量、函数参数

     动态内存分配


           
    一般情况下,一个可执行二进制程序(更确切的说,在Linux操作系统下为一个进程单元,在UC/OSII中被称为任务)在存储(没有调入到内存运行)时拥有3个部分,分别是代码段(text)、数据段(data)BSS段。这3个部分一起组成了该可执行程序的文件。

           (1)代码段(text segment):存放CPU执行的机器指令。通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。

           代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

           (2)数据段(data segment):或称全局初始化数据段/静态数据段(initializeddata segment/data segment)。该段包含了在程序中明确被初始化的全局变量、静态变量(包括全局静态变量和局部静态变量)和常量数据。

           (3)未初始化数据段:亦称BSS(Block Started by Symbol)。该段存入的是全局未初始化变量、静态未初始化变量。

           而当程序被加载到内存单元时,则需要另外两个域:堆域和栈域。图1-1所示为可执行代码存储态和运行态的结构对照图。一个正在运行的C程序占用的内存区域分为代码段、初始化数据段、未初始化数据段(BSS)、堆、栈5个部分。

     

    1-1  C语言可执行代码结构

         (4)栈段(stack):存放函数的参数值、局部变量的值,以及在进行任务切换时存放当前任务的上下文内容。

         (5)堆段(heap):用于动态内存分配,即使用malloc/free系列函数来管理的内存空间。

        在将应用程序加载到内存空间执行时,操作系统负责代码段、数据段和BSS段的加载,并将在内存中为这些段分配空间。栈段亦由操作系统分配和管理,而不需要程序员显示地管理;堆段由程序员自己管理,即显示地申请和释放空间。

        另外,可执行程序在运行时具有相应的程序属性。在有操作系统支持时,这些属性页由操作系统管理和维护。

  • 相关阅读:
    软工实践2019——第二次作业评分
    预培训-个人项
    预培训-阅读-快速阅读并提问
    nodejs异常处理过程/获取nodejs异常类型/写一个eggjs异常处理中间件
    写一个eggjs权限验证中间件
    eggjs的参数校验模块egg-validate的使用和进一步定制化升级
    个人作业——软件工程实践总结作业
    python性能分析(一)——使用timeit给你的程序打个表吧
    软工实践(五)——获小黄衫有感
    团队作业第二次—项目选题(追光的人)
  • 原文地址:https://www.cnblogs.com/catkins/p/5270771.html
Copyright © 2020-2023  润新知