💌 所属专栏:【操作系统】
😀 作 者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 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 等嵌入式系统中,程序运行时内存分为三个主要区域:
- 程序区(Code Area):存放在 Flash 中,包含
.text
和.rodata
,不可修改- 静态存储区(Static Area):存放在 RAM 中,包含
.data
和.bss
,用于全局变量和static
变量- 动态存储区(Dynamic Area):存放在 RAM 中,包含
.stack
和.heap
,用于函数调用和动态内存分配
版权声明:
本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。