您的位置:首页 > 其它

u-boot分析--u-boot.lds

2013-12-17 17:00 190 查看
转载地址:/article/6998159.html

Bootloader启动大多都分为两个阶段。第一阶段主要包含依赖于CPU的体系结构的硬件初始化的代码,通常都用汇编语言来实现;第二阶段通常用C语言来完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。

U-Boot的启动代码分布在start.s、low_level_init.s、board.c和main.c文件中:

start.s:是U-Boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;
low_level_init.s:是特定开发板的设置代码;
board.c:包含开发板底层设备驱动;
main.c:是一个与平台无关的代码,U-Boot应用程序的入口在此文件中;

第一阶段对应的文件是 /cpu/XXX/start.s 和 /board/freescale/XXX/low_level_init.s。
第二阶段对应的文件是 /lib_arm/board.c,最后跳转到 /common/main.c,main_loop在标准转入设备中接受命令行,然后分析,查找,执行。



一个可执行的image必须有一个入口点,并且只能有一个全局入口点,所以要通知编译器这个入口在哪里,入口点是通过链接脚本来实现的,是在 /cpu/arm_cortexa8/u-boot.lds中指定的,其中ENTER(_start)说明程序是从_start开始运行,而它指向的是 /cpu/arm_cortexa8/start.o 文件。
因为我们用的是cortex-a8的cpu架构,在cpu复位后从iROM地址0x00000000取它的第一条指令,执行iROM代码的功能是把Flash中的前16K的代码加载到iRAM中,系统上电后将首先执行u-boot程序。
首先我们来看一下u-boot.lds链接脚本,通过它我们可以知道它整个程序的各个段是怎么存放的。

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;

. = ALIGN(4);
.text	:
{
cpu/arm_cortexa8/start.o	(.text)
*(.text)
}

. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

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

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

__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;

. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}


说明1:标准应用程序包括3类标准段空间:.text 运行代码段;.data 全局变量等具有初始化值的数据空间;.bss暂态变量,堆栈等数据空间
说明2:.rodata,.got,.u_boot_cmd 等段空间由程序员设计需要而自行定义的段空间;
说明3:采用的CPU其指令字长为4字节的,所以地址调整为4字节;

我们查看Makefile中的LDFLAGS变量,发现一条指令:
LDFLAGS+=-Ttext $(TEXT_BASE),其中TEXT_BASE是在u-boot根目录的board文件夹的对应的开发板名字的子目录下的config.mk文件中定义的。在链接的时候 ld 命令会把参数 -Ttext 指定的地址赋给 .text ,所以 .text 在u-boot.lds中的默认地址不起作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: