• 【嵌入式】---- 内存四区介绍


    一、内存四区由来

    程序执行是跑在内存中的,而程序中不同的对象(如 指针,局部变量,全局变量,函数参数 等等)要求的生命周期是不同的,所以将这些对象放在不同的区段,这样就赋予了这些对象不同的生命周期,内存四区由此而来。

    二、内存四区介绍

    内存四区分为:栈区,堆区,全局区,代码区。

    1. 栈区(stack)

    栈区由编译器自动分配和释放。

    栈区主要存放函数参数、函数返回值、局部变量。

    2. 堆区(heap)

    堆区由程序员手动分配和释放。如果程序员未释放,在程序运行结束时,由系统释放。

    堆区主要存放由 malloc 关键字申请的内存空间。在C++语言中关键字 new 申请的内存也在堆区。

    3. 全局区

    全局区又叫数据区或者静态区。

    全局区分为三段: data段 、bss段、rodata 段。
    (1).data 段存放已初始化和值不为0的全局变量和静态变量
    (2).bss 段存放未初始化和初始化值为0的全局变量和静态变量。
    (3).rodata 段存放各类常量,如:const、字符串、#define等

    data 段又叫 RW-data 段
    bss 段又叫 ZI-data 段
    rodata 段又叫常量区或只读存储区
    
    • 1
    • 2
    • 3

    4. 代码区(text)

    代码区又叫 code 段 或 text 段。

    用来存放程序代码,由操作系统进行管理,只读。

    三、额外补充

    flash 或者 ROM 掉电后数据还是保存的,保存的数据有 RO-data、RW-data、代码区

    RAM 一般指的就是 sdram,运行速度快,但是掉电数据会丢失,保存的数据有 栈区、堆区、数据区

    注意:
    1,flash 或者 ROM 中为什么不保存 ZI-data?
    ZI-data 段数据未初始化或初始化为0,在启动系统时直接将这块 flash 或者 ROM 清0即可,无需保存。
    2,RW-data 是 RAM 使用的,为什么存储到 flash 或 ROM 中?
    RW-data 这部分变量已经初始化了,只存在RAM中掉电会丢失,所以需要在flash 或 ROM 中存储一份

  • 相关阅读:
    git diff与linux diff的输出格式之unified format
    InfiniteScroll 无限滚动组件第一次进来就执行load方法怎么办
    设计模式之策略模式
    高性能MySQL实战第11讲:如何做到MySQL高扩展性?
    【滑动窗口(全注释)—Leetcode刷题方法汇总】
    OpenHarmony 持久化存储 UI 状态:PersistentStorage
    c++_learning-进阶部分
    18. 四数之和
    springboot导出Excel中,文件名带@,没有正常显示,显示为%40
    JavaScript系列之构造函数与原型
  • 原文地址:https://blog.csdn.net/wyifan_/article/details/125557699