uboot 启动流程分析.docVIP

  • 1
  • 0
  • 约1.33万字
  • 约 12页
  • 2017-11-29 发布于江西
  • 举报
uboot 启动流程分析

U-Boot启动流程 大多数bootloader都分为stage1和stage2两大部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等) 通常都放在stage1,且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。 u-boot启动大致流程如图1所示: ??????????????????????????????????????????????????????????????????????????????????????? 图 1 Stage1 在flash中执行的引导代码,也就是bootloader中的stage1,负责初始化硬件环境,把u-boot从flash加载到RAM中去,然后跳到lib_arm/board.c中的start_armboot中去执行。 u-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下: 1)??定义入口由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash) 的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。 2)??设置异常向量(Exception Vector) 。 3)??设置CPU的速度、时钟频率及中断控制寄存器。 4)??初始化内存控制器 5)??将ROM中的程序复制到RAM中。 6)??初始化堆栈 7)??转到RAM中执行,该工作可使用指令ldr pc, _start_armboot来完成。 Stage2 lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot) 的主函数,该函数主要流程分析如下: void start_armboot (void) { ??? init_fnc_t **init_fnc_ptr; ??? char *s; #if !defined(CFG_NO_FLASH) || defined (CONFIG_VFD) || defined(CONFIG_LCD) ??? ulong size; #endif #if defined(CONFIG_VFD) || defined(CONFIG_LCD) ??? unsigned long addr; #endif ??? /* Pointer is writable since we allocated a register for it */ ??? /* 给全局数据变量gd安排空间 */ ??? gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); ??? ??? /* compiler optimization barrier needed for GCC = 3.4 */ ??? __asm__ __volatile__(: : :memory); ??? /* 给板子数据变量gd-bd安排空间 */ ??? memset ((void*)gd, 0, sizeof (gd_t)); ??? gd-bd = (bd_t*)((char*)gd - sizeof(bd_t)); ??? memset (gd-bd, 0, sizeof (bd_t)); ??? monitor_flash_len = _bss_start - _armboot_start; ??? ??? /* 顺序执行init_sequence数组中的初始化函数 */ ??? for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) { ??????? if ((*init_fnc_ptr)() != 0) { ??????????? hang (); ??????? } ??? } ??? /*初始化函数列表: ??? init_fnc_t *init_sequence[] = { ??? cpu_init,???????????????? /* basic cpu dependent setup */ #if defined(CONFIG_SKIP_RELOCATE_UBOOT) ??? reloc_init,??????????? /* Set the relocation done flag, must ?????????????????????????? do this AFTER cpu_init(), but as soon ????????????????????

文档评论(0)

1亿VIP精品文档

相关文档