ARM 中常用的段分类说明

来源:互联网 发布:windows ctypes 编辑:程序博客网 时间:2024/04/27 07:24

 

Arm 系统中常用的段分类说明

 

.text段是代码段。它用来放程序代码(code)。它通常是只读的。

.data段是数据段。它用来存放初始化了的(initailized)全局变量(global)和初始化了的静态变量(static)。它是可读可写的。

.bss段是全局变量数据段。它用来存放未初始化的(uninitailized)全局变量(global)和未初始化的静态变量(static)。它也是可读可写的。bss是英文Block Started by Symbol的缩写。之所以把bss跟data分开来,是因为系统会为这些bss段的变量的初值清零。

.rodata段是常量数据段。它用来存放常量(const)。它也是只读的。

在ARM的集成开发环境中,

1、只读的代码段称为Code段,即上述的.text段。

2、只读的常量数据段,被称作RO Data段,即上述的.constdata段。

以上两个段统称为RO段(Read Only),放在ROM或FLASH等非易失性器件中。

3、可读可写的初始化了的全局变量和静态变量段,被称作RW Data段(ReadWrite),即上述的.data段。

4、可读可写的未初始化的全局变量和静态变量段,被称作ZI Data段(Zero Init),即上述的.bss段。因为这个段里的变量要被初始化为零,所以叫ZI段。

以上两个段统称为RW段,而在运行时,它必须重新装载到可读可写的RAM中。

一 可执行文件组成及内存映射

在ADS下,可执行文件有两种,一种是.axf文件,带有调试信息,可供AXD调试工具使用.另一种是.bin

文件,可执行的二进制代码文件。我们重点是讲描.bin文件的组成。

我们把可执行文件分为两种情况:分别为存放态和运行态。

1. 存放态

存放态是指可执行文件通过fromelf产生后,在存储介质(flash或磁盘)上的分布. 此时可执行文件一

般由两部分组成:分别是代码段和数据段。代码段又分为可执行代码段(.text)和只读数据段(.rodata),

数据段又分为初始化数据段(.data)和未初始化数据段(.bss)。可执行文件的存放态如下:

+-------------+-----------

| .bss |

+-------------+-- 数据段

| .data |

+-------------+-----------

| .rodata |

|_____________| 代码段

| .text |

+-------------+-----------

2. 运行态

可执行文件通过装载过程, 搬入到RAM中运行, 这时候可执行文件就变成运行态。在ADS下对可执行代

码各段有另一个名称:

| ... |

+-------------+-----------

| .bss | ZI 段

+-------------+-- 数据段

| .data | RW 段

+-------------+-----------

| .rodata |

|_____________| 代码段(RO 段)

| .text |

+-------------+-----------

| ... |

装载前

当可执行文件装载后, 在RAM中的分布如下:

| ... |

+-------------+-- ZI段结束地址

| ZI 段 |

+-------------+-- ZI段起始地址

| 保留区2 |

+-------------+-- RW段结束地址

| RW 段 |

+-------------+-- RW段起始地址

| 保留区1 |

+-------------+-- RO段结束地址

| RO 段 |

+-------------+-- RO段起始地址

| ... |

装载后

所以装载过程必须完成把执行文件的各个段从存储介质上搬到RAM指定的位置。而这个装载过程由谁来完

成呢?由我们的启动程序来完成.

二 装载过程

在ADS中,可以通过两种方式来指定可执行代码各段在RAM中的位置,一个是用armlink来指定,一种是

用scatter文件来指定.RAM区的起始地址:0x30000000.

1. armlink指定代码段地址

我们通常的代码,只用指定两个段开始地址, RO段的起始地址和RW段的起始地址, ZI段紧接在RW段之

后.示例见该部分的1.1.3.

2. scatter指定代码段地址

我们也可以通过scatter文件指定可执行文件各段的详细地址. Scatter文件如下:

MYLOADER 0x30000000

;MYLOADER: 为可执行文件的名称, 可自定义

;0x3000000: 起始地址

{

RO 0x30000000

;RO 只读代码段的名称

;0x30000000: 只读代码段的起始地址

{

init.o (Init, +First)

; Init代码段为可执行文件的第一部分.

* (+RO) ;所有其它的代码段和只读数据段放在该部分

}

RW +0

;RW: RW段的名称

;+0: 表示RW段紧接着RO段

{

* (+RW) ;所有RW段放在该部分

}

ZI +0

;ZI: ZI段的名称

;+0: 表示ZI段紧接着RW段

{

*(+ZI) ;所有ZI段放在该部分

}

}

3. ADS产生的各代码段宏

|Image$$RO$$Base| /* RO代码段起始地址 */

|Image$$RO$$Limit| /* RO 代码段结束地址 */

|Image$$RW$$Base| /* RW代码段起始地址 */

|Image$$RW$$Limit| /* RW 代码段结束地址 */

|Image$$ZI$$Base| /* ZI 代码段起始地址 */

|Image$$ZI$$Limit| /* ZI 代码段结束地址 */

注意:在两个$$之间的名称, 与scatter中指定的段的名称相同.

4. 装载过程说明

当从NorFlash启动时, 要把flash芯片的首地址映射到0x00000000位置, 系统启动后, 启动程序本身把自己从

flash中搬到RAM中运行. 搬移后的各段起始地址, 由以上宏来确定.

当从NandFlash启动时, S3C2410会自动把前NandFlash的前4k搬到S3C2410的内部RAM中,并把内部

RAM的首地址设为0x00000000,CPU从0x00000000开始执行. 所以, 在nandFlash的前4k程序中,必须包含从

NandFlash把BootLoader的其余部分装入RAM的程序.

附:TI 编译中常用的段说明

系统常用的段定义:

.cinit:包含未用const声明的外部(external)或静态(static)数据表

.const:包含已用const声明的外部或静态数据表以及字符串常量。

.text:包含所有可执行的代码以及常量。

.bss:用于为cinit段以及未初始化的全局和静态变量保留空间(一般是内存空间)

 

 

 

来自:http://nasa1008.blog.163.com/blog/static/37423982201037112224432/

原创粉丝点击