u-boot链接脚本分析

Posted on 2015-03-29 10:02  笨笨滴菜鸟  阅读(410)  评论(0编辑  收藏  举报

 

eclipse 64位下载地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/kepler/SR1/eclipse-standard-kepler-SR1-win32-x86_64.zip

如果从nand flash 启动,0地址就对应的是nand flash ,nand flash 不能像内存那样去写,通过这个可以判断是否是从nand flash 启动

U-boot最根本的目标:启动内核
1.从flash中读出内核
2.启动内核

单板初始化等一系列初始化

环境变量,先看flash上有没有环境变量,没有就使用默认的环境变量

start_armboot
flash_init
nand_init

-->main_loop

一:启动内核:
s = getenv("bootcmd")
run_command(s...)

U-boot界面:
readline (读入串口数据)
run_command

U-boot的核心:command(命令!)

U-boot命令:
1.输入命令字符串->动作(函数name) ,这里会有个命令结构体。

从Usb口下载文件到内存的时候会生成一些环境变量或宏

u-boot链接脚本的分析:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)//指定输出可执行文件的平台为ARM
ENTRY(_start)
SECTIONS
{
. = 0x34000;
. = ALIGN(4);

.text :
{
arch/start.o(.text)
*(.text)
}

. = ALIGN(4);
.data :
{
*(.data)
}

. = ALIGN(4);

.rodata :
{
*(.rodata)
}


. = ALIGN(4);

_bss_start = .;
.bss :
{
*(.bss)
}
_bss_end = .;

}


链接脚本的意义:
一个可执行img(镜像)文件必须有一个入口点,并且只能有一个全局入口点,通常这个入口点的地址放在ROM(Flash)的0x0000000位置,
因此我们必须使编译器知道这个入口地址,而该过程是通过修改连接脚本文件来完成的。

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm"):指定可执行文件输出格式是elf32,小端 和arm体系结构

OUTPUT_FORMAT(DEFAULT,BIG,LITTLE) : 这一行的目的是指定输出目标文件的输出文件格式,一共三种,缺省是第一种DEFAULT若有命令行选项-EB, 则使用
第2个BFD格式; 若有命令行选项-EL,则使用第3个BFD格式. 否则默认选第一个BFD格式.

三个分别指定在缺省、大端、小端 情况下的输出可执行文件格式,u-boot-1.1.6在这里(缺省为第一种,即elf32-littlearm)
指定可执行文件输出格式是elf32,小端 和arm体系结构

OUTPUT_ARCH(arm)//指定输出可执行文件的平台为ARM

ENTRY(_start)
ENTRY(_start)在这里的意思是——指定启动时的函数入口地址,_start在每个CPU目录下的start.S中定义,真正的启动运行
地址段在编译时在/u-boot-1.1.6/board/smdk2410/config.mk中由TEXT_BASE宏定义,即TEXT_BASE?=?0x33F80000

下面开始分析SECTIONS:
SECTIONS
{
. = 0x00000000;
这里的点”.”,是定位器符号(GNU风格的一个典型)。
把定位器符号置为0x00000000 (若不指定, 则该符号的初始值为0)。
定系统启动从偏移地址零处开始。注意这只是个代码地址偏移值,真正的起始地址是由编译时指定的CFLAGS指定的。
. = ALIGN(4);
4字节对齐调整,那么ALIGN(0x10) 即16字节对齐后

.text
{
cpu/arm920t/start.o (.text) /*.text段空间 */
*(.text) /*后续.text段内容的分配*/
}

这段脚本的意思是将所有输入文件的.text?section,以及cpu/arm920t/start.o合并成一个.text?section,
该section的地址由定位器符号的值指定(字节对齐后定位器符号的值)。

. = ALIGN(4);
.rodata : /*.rodata只读数据段*/
{
*(.rodata)
}
这段脚本的意思是先进行4字节对齐,然后将所有输入文件的.rodata section,合并成一个.rodata section,
该section的地址由定位器符号的值指定(字节对齐后定位器符号的值)。

. = ALIGN(4);
__bss_start =.; /* .bss段开始位置 */
.bss :
{
*(.bss)
}
_end =.; /* .bss段结束位置 */ }
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************