【操作系统】一篇搞懂系统中的内存结构(原创)

💌 所属专栏:【操作系统】
😀 作  者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 Linux、网络通信、编程技巧、面试总结与软件工具分享,持续输出实用干货!
💡 欢迎大家:这里是兰舟比特的技术小站,喜欢的话请点赞、收藏、评论三连击!有问题欢迎留言交流😘😘😘


✅写在前面,内存常常是比较困扰我们的地方,搞清楚内存结构,对于我们理解系统的运行机制是非常有帮助的,这篇文章,先整体介绍一下内存结构的框架,让我对于内存先从宏观上有个认识,再选择不懂的点逐个击破。


📊 下面先从一张树状图梳理一下内存的框架

Memory (Memory Map)
│
├── 程序区(Code Area / Text Segment)
│     └── Flash (ROM) → .text, .rodata
│           - main(), printf(), const strings
│
├── 静态存储区(Static Storage Area)
│     └── RAM (AXISRAM / SRAM) → .data, .bss
│           - 全局变量、static 变量
│
└── 动态存储区(Dynamic Storage Area)
      ├── 栈(Stack)→ .stack
      │     - 局部变量、函数调用上下文
      │
      └── 堆(Heap)→ .heap
            - malloc/free 分配的内存

✅ 一、程序区(Program Area / Code Area / Text Section)

🔹 定义:

程序区用于存放程序的可执行代码(即编译后的机器指令)。

在嵌入式系统中,这部分内容通常被烧写到 Flash(ROM) 中,而不是 RAM 中。

🔹 存放内容:

  • 函数体(如 main()SysTick_Handler()
  • 常量字符串(如 "Hello World"
  • 只读数据(如 const int value = 10;

这些内容在程序运行过程中 不会被修改,因此适合存放在只读存储器中。


🧠 二、结合 .icf 文件说明

.icf 文件是 IAR Embedded Workbench 开发环境中用于配置 链接器(Linker)行为的文件

📌 .icf 文件的作用
.icf 文件的主要作用是告诉链接器:

> 程序中各个段(如代码段 .text、数据段 .data、堆栈 .heap 和 .stack)应该放在芯片的哪些内存地址上
> 各个内存区域的起始地址和大小 堆栈(CSTACK)、堆(HEAP)的大小 是否需要初始化某些段
> 是否要将某些代码或数据放到特定的内存区域(如高速 SRAM)

.icf 文件中定义了:

define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
place in ROM_region { readonly };

这段配置表示:

  • 所有 只读内容(包括程序代码和常量)都分配到了 Flash 区域
  • 这就是我们说的 程序区

✅ 三、程序区的主要段(Section)

段名描述
.text主要存放函数代码(机器指令)
.rodata只读数据,如字符串常量、const 全局变量

例如:

const int magic_number = 0x12345678; // 放在 .rodata
void main() {
    // 这里的代码会编译成机器码,放在 .text 段
}

✅ 四、三大区域对比总结

类别内容存储位置是否可变生命周期示例
程序区(Code/Text)代码、常量字符串、const 数据Flash(ROM)❌ 不可变整个程序运行期间main() 函数、printf("hello")
静态存储区(Static Data)全局变量、static 变量RAM(如 AXISRAM)✅ 可变整个程序运行期间int global_var = 10;
动态存储区(Dynamic Data)堆(Heap)、栈(Stack)RAM(如 AXISRAM 或 DTCM)✅ 可变动态变化(函数调用或手动分配)malloc() 分配的数据、局部变量

✅ 五、为什么程序区放在 Flash 而不是 RAM?

  • Flash 是非易失性存储器,掉电后程序不丢失
  • RAM 是易失性的,不适合长期保存程序代码
  • Flash 的访问速度比 RAM 慢,但 Cortex-M 架构使用了缓存机制(ITCM/DTCM)来提高执行效率

✅ 六、总结一句话:

在 STM32 等嵌入式系统中,程序运行时内存分为三个主要区域:

  1. 程序区(Code Area):存放在 Flash 中,包含 .text.rodata,不可修改
  2. 静态存储区(Static Area):存放在 RAM 中,包含 .data.bss,用于全局变量和 static 变量
  3. 动态存储区(Dynamic Area):存放在 RAM 中,包含 .stack.heap,用于函数调用和动态内存分配

版权声明:

本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兰舟比特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值