ARM内核架构(四)——RO、RW、ZI和.text .bss .data

本文详细介绍了ARM架构中RO、RW及ZI段的作用与区别。RO段包含只读代码和常量;RW段存放初始化为非0值的变量;ZI段则用于未初始化或初始化为0的变量。

ARM内核架构(四)——RO、RW、ZI和.text .bss .data

小狼@http://blog.youkuaiyun.com/xiaolangyangyang


RO段包括只读代码段(code段/.text段)和常量段(RO Data段/.constdata段)

  1. RW段(.data段)指已被初始化成非0值的变量段
  2. ZI段(.bss段)指未被初始化或初始化为0的变量段
<think>嗯,用户询问的是嵌入式系统中内存布局配置,特别是ARM架构下的LR_IROM1、ER_IROM1、RW_IRAM1等区域配置。用户可能正在开发基于GD32F103/GD32F407的嵌入式系统,需要理解MDK链接脚本的编写规范。 从引用内容看,用户提供的资料非常具体,包括GD32芯片的datasheet引用实际linker script片段。这说明用户不是初学者,而是正在进行实际项目开发,遇到了内存映射配置问题。用户的核心需求应该是理解这些内存区域的实际作用及配置依据。 需要重点解释三个关键区域: LR_IROM1是加载域起点,对应芯片Flash起始地址。在GD32F103vet6中是0x08000000(引用1),GD32F407则是0x00300000(引用3)——这里0x00300000可能是笔误,根据ARM Cortex-M标准映射应该是0x08000000。 ER_IROM1作为执行域,通常与加载域地址一致,存放只读代码。关键要注意RESET段必须用+First强制放在起始位置,这是为了正确指向中断向量表。 RW_IRAM1配置特别重要,它决定RAM分配。用户引用中GD32F103配置为0x20000000/64KB,而GD32F407则是相同地址但192KB(0x00030000),这需要严格对应芯片手册的SRAM章节。 用户可能隐含的深层需求是:为什么有时需要多个RAM区域?这涉及到高频访问数据(如中断栈)需要放在紧耦合存储器的情况。虽然当前脚本只有RW_IRAM1,但引用2的示例显示LPC2378就使用了独立堆栈域。 最后需要强调配置错误的后果:比如RW_IRAM1尺寸超限会导致未定义行为,这在引用3的192KB配置中尤为关键——必须确认GD32F407的SRAM是否确实位于0x20000000且连续192KB。</think>在嵌入式系统中,内存布局配置通过分散加载文件(Scatter-Loading File)定义,尤其在 ARM 架构的芯片开发中至关重要。以下是对关键区域的详细解释: --- ### **1. 加载域(Load Region)** - **LR_IROM1** 表示代码只读数据的**加载地址**(Flash 存储位置)。 - 格式:`LR_IROM1 <起始地址> <大小>` - 示例:`LR_IROM1 0x08000000 0x00300000` - `0x08000000`:GD32 系列 Flash 的起始地址(参考 GD32F407xx 手册)[^3] - `0x00300000`:Flash 大小为 3MB(需严格匹配芯片规格)[^3] --- ### **2. 执行域(Execution Regions)** #### **(1) ER_IROM1:代码执行域** 定义代码在内存中的**运行时地址**(通常与加载地址相同)。 - 格式:`ER_IROM1 <起始地址> <大小> { ... }` - 关键内容: ```c *.o (RESET, +First) // 中断向量表必须放在起始位置 *(InRoot$$Sections) // 包含内核初始化代码 .ANY (+RO) // 所有只读数据(代码、常量) ``` - 地址需与 `LR_IROM1` 一致(如 `0x08000000`)[^1][^3]。 #### **(2) RW_IRAM1:读写数据域** 分配 RAM 中的**读写数据**(变量、堆栈等)。 - 格式:`RW_IRAM1 <起始地址> <大小> { ... }` - 示例:`RW_IRAM1 0x20000000 0x00030000` - `0x20000000`:ARM Cortex-M 内核 SRAM 起始地址 - `0x00030000`:192KB RAM(根据芯片手册配置)[^3] - 关键内容: ```c .ANY (+RW +ZI) // +RW:已初始化变量;+ZI:未初始化变量(零初始化) ``` #### **(3) RW_IRAM2(可选)** 用于**扩展 RAM 区域**(如外部 RAM 或保留内存): ```c RW_IRAM2 0x40000000 0x0000E800 { *(+RW +ZI) // 分配额外数据 } ``` --- ### **3. 堆栈域(Heap/Stack)** 独立定义堆栈地址(常见于 RTOS): ```c ARM_LIB_HEAP 0x40007000 EMPTY 0x100 {} // 堆地址 ARM_LIB_STACK 0x40008000 EMPTY -0xE00 {} // 栈地址(向下生长) ``` - `EMPTY`:预留未初始化空间 - 地址需在 RAM 范围内(如 `0x40000000` 是外设地址,需根据芯片调整)[^2]。 --- ### **配置原则与注意事项** 1. **地址对齐** - Flash/RAM 起始地址必须严格遵循芯片手册(如 GD32F103 的 Flash 为 `0x08000000`)[^1][^3]。 2. **大小匹配** - 域大小需 ≤ 芯片物理内存(如 GD32F407 的 192KB RAM 对应 `0x00030000`)[^3]。 3. **中断向量表** - `RESET` 段必须通过 `+First` 置于 Flash 起始位置[^1][^3]。 4. **多区域场景** - 高频数据可放入高速 RAM(如 CCM RAM),需额外定义域。 --- ### **错误配置的后果** - **地址溢出**:导致数据覆盖或硬件错误。 - **大小超限**:链接失败(如 `RW_IRAM1` 超过 192KB)。 - **堆栈冲突**:未隔离堆栈可能引发运行时崩溃。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值