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

转载地址:http://www.cnblogs.com/zzx1045917067/archive/2012/12/09/2809760.html


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

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

  1. start.s:是U-Boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;
  2. low_level_init.s:是特定开发板的设置代码;
  3. board.c:包含开发板底层设备驱动;
  4. 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中的默认地址不起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值