u-boot.lds代码如下:
简要说明该文件作用,该文件是链接脚本文件,在编译uboot时指定uboot可执行镜像文件链接方式,指定个段的装载地址与执行地址
/*
/*指定输出文件格式elf,32位mips指令,大端*/
*/
OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
OUTPUT_ARCH(mips)/*指定输出文件的平台体系mips*/
ENTRY(_start)/*可执行镜像文件的起始段名_start,也称之为入口点*/
SECTIONS /*连接器脚本命令*/
{
/*这个.特殊 符号是位置计数器*/
. = ALIGN(4);/*4字节对齐*/
.text : /*输出代码段*/
{
*(.text)/*表示所有的输入代码段*/
}
. = ALIGN(4);
.rodata : { *(.rodata) }/*只读数据段*/
. = ALIGN(4);
.data : { *(.data) }/*可读写数据段*/
. = ALIGN(4);
.sdata : { *(.sdata) }/*未初始化可读写数据段*/
_gp = ALIGN(16);
__got_start = .;
.got : { *(.got) }/*指定got段*/
__got_end = .;
.sdata : { *(.sdata) }
. = .;
__u_boot_cmd_start = .;
/*u-boot命令段*/
.u_boot_cmd : { *(.u_boot_cmd) }
uboot_end_data = .;
num_got_entries = (__got_end - __got_start) >> 2;
. = ALIGN(4);
.sbss : { *(.sbss) }/*未初始化的bss*/
.bss : { *(.bss) } /*BSS段*/
uboot_end = .;
}
当我们编译u-boot时会看到如下内容:
这个-DTEXT_BASE宏指定代码段的起始基地址为0x9fc00000
当u-boot编译成功后我们可以在u-boot.map
我们看到_start的起始地址就是虚地址0x9fc00000
当设备断电重启首先执行的就是_start在0x9fc00000地址
那么TEXT_BASE在那里指定,我们在config.mk中发现有如下代码:
# ROM version
TEXT_BASE = 0x9fc00000
# RAM version
#TEXT_BASE = 0x80100000
编译时用TEXT_BASE赋给.text,这样就指定了执行代码段的起始基地址。