打印

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

[复制链接]
1055|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3B1105|  楼主 | 2011-12-23 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
.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://yiguibugui.taobao.com/

315

主题

1645

帖子

4

粉丝