uboot启动流程分析.doc
《uboot启动流程分析.doc》由会员分享,可在线阅读,更多相关《uboot启动流程分析.doc(12页珍藏版)》请在三一文库上搜索。
1、uboot启动流程分析U-BootU-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系
2、统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-B
3、oot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk以下简称W.D本人精湛专业水平和执着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。uboot启动流程分析可知程序的入口在_sta
4、rt,在SourceInsight中查找可发现程序的入口_start在u-boot-2016.05archarmlibvectors.S中。ENTRY(_start)SECTIONS。 = 0x00000000;。 = ALIGN(4);.text :*(._image_copy_start)*(.vectors)CPUDIR/start.o (.text*)*(.text*)。 = ALIGN(4);.rodata : *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*) 。 = ALIGN(4);.data : *(.data*)。 = ALIGN(4);。
5、 = 。;。.bss_start _rel_dyn_start (OVERLAY) : KEEP(*(._bss_start);_bss_base = 。;.bss _bss_base (OVERLAY) : *(.bss*)。 = ALIGN(4);_bss_limit = 。;.bss_end _bss_limit (OVERLAY) : KEEP(*(._bss_end);。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152进入boot-2016.0
6、5archarmlibvectors.S中,可以看到从_start开始后就跳转到reset去执行:。.globl _start。_start:#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG.word CONFIG_SYS_DV_NOR_BOOT_CFG#endifb resetldr pc, _undefined_instrucTIonldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq。.123456789
7、101112131415161718192021221、从u-boot-2016.05archarmcpuarm920tstart.S中reset执行主要执行流程:reset - cpu_init_crit - lowlevel_init - _mainreset:。#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit#endifbl _main。#ifndef CONFIG_SKIP_LOWLEVEL_INITcpu_init_crit:。bl lowlevel_init。#endif /* CONFIG_SKIP_LOWLEVEL_INIT *
8、/12345678910111213141516171819202122232、由bl _main跳转到u-boot-2016.05archarmlibcrt0.S中从入口_main开始执行主要执行流程:board_init_f - relocate_code - board_init_rENTRY(_main)。bl board_init_f_alloc_reserve。bl board_init_f_init_reserve。bl board_init_f#if ! defined(CONFIG_SPL_BUILD)。b relocate_code。#endif#if !defined(C
9、ONFIG_SPL_BUILD) | defined(CONFIG_SPL_FRAMEWORK)。#if defined(CONFIG_SYS_THUMB_BUILD)。#elseldr pc, =board_init_r#endif#endifENDPROC(_main)123456789101112131415161718192021222324252627282930313233这部分有三点说明:、u-boot-2016.05commonboard_f.c:board_init_f通过initcall_run_list(init_sequence_f)函数执行一系列初始化函数以实现前半部
10、分板级初始化。全局结构体gd在u-boot-2016.05archarmincludeasmglobal_data.h中声明:#define DECLARE_GLOBAL_DATA_PTR register volaTIle gd_t *gd asm (r9)1、u-boot-2016.05archarmlibrelocate.S:relocate_code实现uboot代码的重定位,此部分如果觉得源代码不是简单明了可自己改写。、去重定位uboot有两种路径:一种是将gd-flags设为0,在初始化函数序列init_sequence_f中的jump_to_copy函数中去跳转到relocate
11、_code:staTIc int jump_to_copy(void)if (gd-flags GD_FLG_SKIP_RELOC)return 0;。#if defined(CONFIG_X86) | defined(CONFIG_ARC)。#elserelocate_code(gd-start_addr_sp, gd-new_gd, gd-relocaddr);#endifreturn 0;1234567891011121314另一种就是不宏定义CONFIG_SPL_BUILD,然后在u-boot-2016.05archarmlibcrt0.S中通过#if ! defined(CONFIG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uboot 启动 流程 分析
链接地址:https://www.31doc.com/p-3274403.html