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

难度:★★
本文首发于我的嵌入式技术号「OneChan讲Soc嵌入式」,未经授权禁止转载。


先看一张典型 Cortex-M3 芯片的 RAM 布局图:

高地址  0x20010000  ┌─────────────────┐
                    │      栈          │  ← SP 初始指向这里,向下增长
                    │      ↓          │
                    │                 │
                    │      ↑          │
                    │      堆          │  ← 堆从这里向上增长
低地址  0x20000000  ├─────────────────┤
                    │    .data/.bss    │
                    └─────────────────┘

栈从高地址向下增长,堆从 .bss 段末尾向上增长。如果二者在中间相遇——栈的压栈操作写入了堆管理器刚分配出去的内存块,或者堆的 malloc 返回了一块栈正在使用的空间——程序不会立刻崩溃。它会在某个毫无防备的时刻,用错数据,跳错地址,然后以 HardFault 收场。

这就是栈和堆重叠的本质:两块动态内存区域,相向增长,在没有物理隔离的情况下,迟早会撞上。 而且这个碰撞,链接器在编译时能预测一部分,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OneChan讲Soc嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值