You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

微控制器内存组织:分段模型还是平坦模型?链接器段相关疑问

微控制器内存模型:平坦模型 vs 链接器的“段”

嘿,这个问题问得特别到位——刚接触嵌入式内存管理的时候,很多人都会把链接器的逻辑段和硬件的分段模型搞混,我当初也踩过这个坑!

先直接给结论:绝大多数现代微控制器采用的都是平坦内存模型,你一开始的判断是对的。至于你困惑的“链接器生成.bss/.text/.data这些段”,其实和硬件层面的“分段模型”完全不是一回事,咱们拆开来说:

核心区别:硬件分段模型 vs 链接器逻辑段

1. 平坦内存模型的本质

平坦模型的核心是:整个系统的地址空间是一个单一、连续的线性范围,CPU只需要一个完整的地址值(比如32位MCU的32位地址)就能直接访问任意内存位置,不需要额外的段寄存器来拼接计算物理地址。

举个实际例子:STM32这类32位MCU的地址空间是从0x00000000到0xFFFFFFFF,Flash(存代码)、RAM(存变量)、外设寄存器都直接映射在这个连续的线性空间里——比如Flash从0x08000000开始,RAM从0x20000000开始,外设从0x40000000开始,CPU访问这些区域时直接用对应的线性地址就行,不需要任何段切换操作。

2. 链接器的.bss/.text/.data是“逻辑段”

链接器生成的这些段,只是编译器/链接器为了方便管理代码和数据而划分的逻辑分组,属于软件层面的组织方式,和硬件的分段模型没有关系:

  • .text:存放只读的程序代码和常量,最终会被加载到Flash这类非易失性存储里
  • .data:存放初始化过的全局变量,编译时存在Flash,程序启动后会被复制到RAM中
  • .bss:存放未初始化的全局/静态变量,程序启动时会被自动清零,占用RAM空间

这些逻辑段最终都会被映射到平坦地址空间的某个具体位置,CPU访问它们的时候依然用的是单一的线性地址,完全不需要像x86实模式那样用段寄存器+偏移来计算地址。

3. 真正的“分段模型”是什么样的

对比一下传统的分段模型(比如x86实模式):CPU需要依赖段寄存器(CS、DS、ES等)的基址,加上指令里的偏移地址,才能计算出实际的物理地址。不同的段可以有重叠的地址范围,甚至能切换不同的地址空间——这才是硬件层面的分段,和链接器的逻辑段完全不是一个概念。

总结一下

链接器的逻辑段是为了分类管理代码和数据的软件手段,而平坦模型是硬件层面的地址空间架构,两者不仅不冲突,反而在平坦模型下用逻辑段来组织代码数据是非常高效的做法。你觉得“类似分段模型”只是因为都用到了“段”这个词,但本质上完全是两回事~

内容的提问来源于stack exchange,提问作者Dusan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:21:12