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

995

被折叠的 条评论
为什么被折叠?



