内容发布更新时间 : 2024/11/19 0:51:33星期一 下面是文章的全部内容请认真阅读。
Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解) Uboot启动分析笔记-----Stage1(start.S与lowlevel_init.S详解)
1 u-boot.lds
首先了解uboot的链接脚本board/my2410/u-boot.lds,它定义了目标程序各部分的链接顺序。 OUTPUT_FORMAT(\ /*指定输出可执行文件为ELF格式,32为,ARM小端*/ OUTPUT_ARCH(arm)
/*指定输出可执行文件为ARM平台*/ ENTRY(_start) /*起始代码段为 _start*/ SECTIONS {
/* 指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置*、 . = 0x00000000;从 0x0位置开始 . = ALIGN(4); 4字节对齐 .text : {
cpu/arm920t/start.o (.text)
board/my2440/lowlevel_init.o (.text) *(.text) }
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4);
.data : { *(.data) } /* 只读数据段 ,所有的只读数据段都放在这个位置*/ . = ALIGN(4);
.got : { *(.got) } /*指定got段, got段式是uboot自定义的一个段, 非标准段*/ . = .;
__u_boot_cmd_start = .; /*把__u_boot_cmd_start赋值为当前位置, 即起始位置*/ .u_boot_cmd : { *(.u_boot_cmd) }
/* u_boot_cmd段,所有的u-boot命令相关的定义都放在这个位置,因为每个命令定义等长,所以只要以__u_boot_cmd_start为起始地址 进行查找就可以很快查找到某一个命令的定义,并依据定义的命令指针调用相应的函数进行处理用户的任务*/ __u_boot_cmd_end = .;
/* u_boot_cmd段结束位置,由此可以看出,这段空间的长度并没有严格限制,用户可以添加一些u-boot的命令,最终都会在连接是存放在这个位置。*/
. = ALIGN(4);
__bss_start = .; /*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); } /*指定bss段,这里NOLOAD的意思是这段不需装载,仅在执行域中才会有这段*/
_end = .; /*把_end赋值为当前位置,即bss段的结束位置*/ }
第一个链接的是cpu/board/start.o,也即Uboot的入口指令在start中,下面详细分析程序的跳转和函数调用关系。
2 Stage1 : cpu/arm920t/start.S
这个汇编程序时UBoot的入口程序,以复位向量开头。
reset ↓
cpu_init_crit ↓ relocate ↓
stack_setup ↓