zoukankan      html  css  js  c++  java
  • Linux内存管理(text、rodata、data、bss、stack&heap)

     

    一、各内存区段的介绍

       系统内的程序分为程序段和数据段,具体又可细分为一下几个部分:

    (1)text段-代码段

          text段存放程序代码,运行前就已经确定(编译时确定),通常为只读,可以直接在ROM或Flash中执行,无需加载到RAM。

          在嵌入式开发中,有时为了特别的需求(例如加速),也可将某个模块搬移到RAM中执行。

    (2)rodata段(read-only-data)-常量区

          rodata段存储常量数据,比如程序中定义为const的全局变量,#define定义的常量,以及诸如“Hello World”的字符串常量。只读数据,存储在ROM中。

          注意:有些立即数与指令编译在一起,放在text段。

                  const修饰的全局变量在常量区;const修饰的局部变量只是为了防止修改,没有放入常量区。

                  编译器会去掉重复的字符串常量,程序的每个字符串常量只有一份。

                  有些系统中rodata段是多个进程共享的,目的是为了提高空间利用率。

    (3)data段

          data存储已经初始化的全局变量,属于静态内存分配。(注意:初始化为0的全局变量还是被保存在BSS段)

          static声明的变量也存储在数据段。

          链接时初值加入执行文件;执行时,因为这些变量的值是可以被改变的,所以执行时期必须将其从ROM或Flash搬移到RAM。总之,data段会被加入ROM,但却要寻址到RAM的地址。

    (4)bss段

          bss段存储没有初值的全局变量或默认为0的全局变量,属于静态内存分配。

          bss段不占据执行文件空间(无需加入程序之中,只要链接时将其寻址到RAM即可),但占据程序运行时的内存空间。

          执行期间必须将bss段内容全部设为0。

    (5)stack段-栈

          stack段存储参数变量和局部变量,由系统进行申请和释放,属于静态内存分配。

         stack的特点是先进先出,可用于保存/恢复调用现场。

    (6)heap-堆

          heap段是程序运行过程中被动态分配的内存段,由用户申请和释放(例如malloc和free)。

          申请时至少分配虚存,当真正存储数据时才分配物理内存;释放时也不是立即释放物理内存,而是可能被重复利用。

    二、总结

    1、执行文件中包含了text、rodata、data段的内容,不包含bss段内容(一堆0放入执行文件没有意义)。

    2、程序被存储的地址和执行时期的地址不一定一致。

       LMA(load memory address):某程序区被存储的地址

       VMA(virtual memory address):程序区段在执行时期的地址

      例如data段会被存储在ROM,但执行时必须加载到RAM,则在ROM中的地址就称为LMA,在RAM中的地址就是VMA。

    3、堆和栈的内存增长方向是相反的:栈是从高地址向低地址生长,堆是从低地址向高地址生长。

    4、局部变量存储在stack中,编写函数时要注意如果该函数被递归调用很多次,可能会引起stack overflow的问题。

    (尤其在嵌入式开发中,内存资源有限,所有内存几乎都会被填满,stack overflow和stack unserflow都极可能引起很大问题)

  • 相关阅读:
    win10下VMware15运行ubuntu18.04无法和主机之间复制粘贴问题
    Redis的五种数据类型
    celery的入门使用
    Django/Flask的一些实现方法
    Python3实现简单的钉钉机器人调用
    装饰者模式
    pyhdfs安装
    使用setup.py安装python包和卸载python包的方法
    zookeeper搭建
    S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
  • 原文地址:https://www.cnblogs.com/DataArt/p/9879192.html
Copyright © 2011-2022 走看看