Cortex-M3:为什么栈和堆不能重叠?链接器如何检测?

📅 2026/8/24 2:11:38
Cortex-M3:为什么栈和堆不能重叠?链接器如何检测?
难度:★★本文首发于我的嵌入式技术号「OneChan讲Soc嵌入式」,未经授权禁止转载。先看一张典型 Cortex-M3 芯片的 RAM 布局图:高地址 0x20010000 ┌─────────────────┐ │ 栈 │ ← SP 初始指向这里,向下增长 │ ↓ │ │ │ │ ↑ │ │ 堆 │ ← 堆从这里向上增长 低地址 0x20000000 ├─────────────────┤ │ .data/.bss │ └─────────────────┘栈从高地址向下增长,堆从.bss段末尾向上增长。如果二者在中间相遇——栈的压栈操作写入了堆管理器刚分配出去的内存块,或者堆的malloc返回了一块栈正在使用的空间——程序不会立刻崩溃。它会在某个毫无防备的时刻,用错数据,跳错地址,然后以 HardFault 收场。这就是栈和堆重叠的本质:两块动态内存区域,相向增长,在没有物理隔离的情况下,迟早会撞上。而且这个碰撞,链接器在编译时能预测一部分,