Uboot启动流程分析和移植介绍
u-boot-2011.03在TQ2440上的移植--最新uboot移植文档

u-boot-2011.03在TQ2440上的移植(1)--建立自己的demo板收藏参考文章黄刚博客/u3/101649/showart_2276917.htmltekkman博客/u1/34474/showart_2212066.html1、到ftp://ftp.denx.de/pub/u-boot/下载u-boot-2010.06.tar.bz22、解压tar jxvf u-boot-2010.06.tar.bz23、进入uboot cd u-boot-2010.064、删减uboot进入/board,留下samsung,其它全部删除进入/arch,留下arm,其它全部删除进入/arch/arm/cpu,留下arm920t,其它全部删除5、建立自己的DEMO板cd /board/samsungmkdir smdk2440cp -rf smdk2410/* smdk2440///将2410下所有的代码复制到2440下cd smdk2440//进入smdk2440目录mv smdk2410.c smdk2440.c//将smdk2440下的smdk2410.c改名为smdk2440.c然后在文件夹samsung里留下smdk2440,其它全部删除cp include/configs/smdk2410.h include/configs/smdk2440.h//建立2440头文件在include/configs下留下smdk2440.h, 其它全部删除vi board/samsung/smdk2440/Makefile//修改smdk2440下Makefile的编译项,如下:COBJS := smdk2440.o flash.o//修改第28行因在smdk2440下我们将smdk2410.c改名为smdk2440.c6、修改u-boot跟目录下的Makefile文件。
查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立my2440_config的编译选项,另外还要指定交叉编译器,修改159行CROSS_COMPILE ?= arm-linux-//指定交叉编译器为arm-linux-gccsmdk2410_config:unconfig//2410编译选项格式@$(MKCONFIG) $(@:_config=)arm arm920t smdk2410 samsung s3c24x0smdk2440_config:unconfig//修改蒂3054行,2440编译选项格式@$(MKCONFIG) $(@:_config=)arm arm920t smdk2440 samsung s3c24x0*说明:arm:CPU的架构(ARCH)arm920t:CPU的类型smdk2440 :对应在board目录下建立新的开发板项目的目录samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULLs3c24x0:CPU型号*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错7、测试编译新建的smdk2440开发板项目在uboot根目录测试make smdk2440_configmake即可在uboot根目录下生成bin文件在uboot里,清除中间文件用命令make distcleanu-boot-2011.03在TQ2440上的移植(2)--初始化时钟收藏smdk2440的初始化设置1、u-boot主要的目录结构如下2、启动流程图下图由上图可知u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
uuboot 移植流程

uuboot 移植流程U-Boot 移植流程介绍U-Boot是一个开源的引导加载程序,常用于嵌入式系统中。
移植U-Boot可以将其适配到不同的硬件平台上,以满足特定需求。
本文将详细说明U-Boot移植的流程。
准备工作1.硬件选型:根据项目需求,选择适合的硬件平台。
2.获取源代码:从U-Boot官方网站或仓库下载最新版本的源代码。
3.安装交叉编译工具链:根据目标硬件平台的指令集架构,选择合适的交叉编译工具链,并进行安装。
4.了解目标硬件平台:熟悉目标硬件平台的架构、引导方式、存储器布局等相关信息。
移植流程1.配置编译环境:设置交叉编译工具链的环境变量,以确保正确编译U-Boot源代码。
2.配置U-Boot:修改U-Boot源代码中的配置文件,根据目标硬件平台的特性和需求进行相应配置。
–配置目标硬件平台的处理器类型、存储器布局等基本信息。
–配置启动方式,如通过网络(TFTP)或存储介质(SD卡、NAND Flash)等进行启动。
–配置启动流程,如引导加载程序的加载顺序、启动脚本等。
3.添加适配代码:根据目标硬件平台的需求,编写适配代码,包括引导加载程序和设备驱动等。
–引导加载程序:为目标硬件平台选择合适的程序入口点,配置启动参数,加载适配的设备驱动等。
–设备驱动:根据目标硬件平台的外设,编写相应的设备驱动代码,以支持外设的初始化和操作。
4.编译U-Boot:使用交叉编译工具链,编译修改后的U-Boot源代码。
–执行make clean清除之前的编译结果。
–执行make命令编译U-Boot源代码。
5.烧录和运行:将编译生成的U-Boot镜像烧录到目标硬件平台,并进行测试。
–根据目标硬件平台的烧录方式(串口、JTAG等),将U-Boot镜像烧录到目标设备。
–启动目标设备,观察U-Boot的启动信息是否正常输出,检查设备驱动是否正常加载。
6.调试和优化:根据实际情况,进行U-Boot的调试和性能优化。
–使用调试工具进行调试,如调试器、串口打印信息等。
uboot启动流程

U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1 U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/和board/samsung/mini2440/。
U-Boot启动第一阶段流程如下:图 U-Boot启动第一阶段流程根据cpu/arm920t/中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/ (.text)board/samsung/mini2440/ (.text)board/samsung/mini2440/ (.text)*(.text)}… …}第一个链接的是cpu/arm920t/,因此的入口代码在cpu/arm920t/中,其源代码在cpu/arm920t/中。
下面我们来分析cpu/arm920t/的执行。
1. 硬件设备初始化(1)设置异常向量cpu/arm920t/开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /*未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量 */ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 */ /* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设置了ARM异常向量表,各个异常向量介绍如下:表 ARM异常向量表在cpu/arm920t/中还有这些异常对应的异常处理程序。
uboot 代码运行流程

uboot 代码运行流程U-boot是一款ARM处理器启动管理程序,在ARM开发板研发中具有非常广泛的应用,它可以在开发板上提供各种服务和支持,使得用户能够轻松地启动系统和进行应用开发。
本文将从U-boot代码运行流程方面来介绍U-boot的一般执行过程。
U-boot代码运行流程主要可以分为两个方面,即bootloader代码执行流程和内核启动代码执行流程。
1. Bootloader代码执行流程Bootloader是指从CPU开始运行到操作系统启动、执行前的代码。
它的主要功能是加载操作系统内核、初始化硬件环境以及对操作系统进行配置等。
U-boot在启动过程中需要经历以下几个步骤:1)CPU复位在系统上电或者发生复位时,CPU内部控制块将根据复位信号重新启动,并从指定地址处读取第一条指令。
2)初始化硬件U-boot对内存、Flash、串口等硬件进行初始化,然后启动U-boot的“彩屏”启动画面。
3)读取启动设备U-boot通过Boot Device Driver从存储设备(SD卡、NAND Flash等)中读取启动文件,然后执行它。
默认情况下,U-boot会从SD卡中读取启动文件。
4)解析启动文件U-boot解析启动文件,提取内核映像、设备树和命令行参数等关键信息。
然后执行其它操作,如设备树重定位、加入命令行参数等。
5)启动内核U-boot将内核映像从Flash中加载到内存中,并将控制权转交给内核。
此时内核开始执行,U-boot自己退出。
2. 内核启动代码执行流程内核启动代码主要是内核启动过程中的初始化工作。
启动过程中,操作系统需要对内存进行初始化、加载一些关键模块、初始化驱动程序等工作,以实现操作系统本身的功能。
1)内核初始化内核初始化包括内存管理、进程管理、文件系统、驱动程序初始化等。
此时内核会创建init进程和kthreadd进程。
2)加载模块内核启动后加载模块,模块提供了丰富的功能,如网络支持、图形界面等。
am335xu-boot启动过程分析

am335xu-boot启动过程分析 u-boot属于两阶段的bootloader,第⼀阶段的⽂件为 arch/arm/cpu/armv7/start.S 和 arch/arm/cpu/armv7/lowlevel_init.S,前者是平台相关的,后者是开发板相关的。
1. u-boot第⼀阶段代码分析 (1)硬件设备初始化 将CPU的⼯作模式设为管理模式(SVC); 关闭中断; 禁⽤MMU,TLB ; 板级初始化; (2)为加载Bootloader的第⼆阶段代码准备RAM空间 加载u-boot.img,跳转到u-boot.img; 上述⼯作,也就是uboot-spl代码流程的核⼼。
代码如下:arch/arm/cpu/armv7/start.S1/*2 * the actual reset code3*/4reset:5 bl save_boot_params6/*7 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,8 * except if in HYP mode already9*/10 mrs r0, cpsr11 and r1, r0, #0x1f @ mask mode bits12 teq r1, #0x1a @ test for HYP mode13 bicne r0, r0, #0x1f @ clear all mode bits14 orrne r0, r0, #0x13 @ set SVC mode15 orr r0, r0, #0xc0 @ disable FIQ and IRQ16 msr cpsr,r017@@ 以上通过设置CPSR寄存器⾥设置CPU为SVC模式,禁⽌中断18@@ 具体操作可以参考《[kernel 启动流程] (第⼆章)第⼀阶段之——设置SVC、关闭中断》的分析1920/* the mask ROM code should have PLL and others stable */21#ifndef CONFIG_SKIP_LOWLEVEL_INIT22 bl cpu_init_cp1523@@ 调⽤cpu_init_cp15,初始化协处理器CP15,从⽽禁⽤MMU和TLB。
uboot启动代码详细讲解

·1 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。
一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1. 引导加载程序。
固化在固件(firmware)中的 boot 代码,也就是 Boot Loader,它的启动通常分为两个阶段。
2. Linux 核。
特定于嵌入式板子的定制核以及核的启动参数。
3. 文件系统。
包括根文件系统和建立于 Flash 存设备之上文件系统,root fs。
4. 用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 等。
引导加载程序是系统加电后运行的第一段软件代码。
回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。
BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。
Boot Loader 的主要运行任务就是将核映象从硬盘上读到 RAM 中,然后跳转到核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。
比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
·2 bootloader简介简单地说,Boot Loader (引导加载程序)就是在操作系统核运行之前运行的一段小程序,它的作用就是加载操作系统,它是系统加电后运行的第一段软件代码。
UBoot移植详解

u-boot 移植步骤详解1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。
其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。
但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。
其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。
这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。
其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。
从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。
当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
Uboot启动流程分析和移植介绍

基于MPC83xx 的U-boot 启动流程分析和移植董 闯北京邮电大学信息与通信工程学院,北京(100876)E-mail :donix.dong@摘 要:本文首先引入Bootloader 的概念,接着介绍U-boot 这种引导程序,并以Freescale 32位微处理器MPC83xx 为例,结合代码详细分析了U-boot 的启动的各个阶段及最终引导Linux 内核的过程,最后,建立交叉编译环境,针对TC8313E 目标板,给出U-boot 移植与编译的基本步骤。
关键词:U-boot;MPC83xx;交叉编译;移植;嵌入式系统中图分类号:TP393.051.引言引导程序(Bootloader)是系统加电后运行的第一段软件代码,类似于PC 机中的引导加载程序BIOS 。
虽然引导程序仅在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的组成部分。
通过这段小程序,初始化必要的硬件设备,创建内核需要的一些信息并将这些信息传递给内核,从而将系统的软、硬件环境配置到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。
2. U-boot 介绍目前,嵌入式领域里出现了很多种类的Bootloader ,如Armboot 、Blob 、Redboot 、vivi 和U-boot 等,其中U-boot 是使用最广泛,功能最完善的。
U-boot (Universal Boot Loader)是从PPCBOOT 发展演化而来[1],其源码目录、编译形式与Linux 内核很相似,事实上,不少U-boot 源码就是相应的Linux 内核源程序的简化,尤其是一些设备的驱动程序,这从U-boot 源码的注释中就能体现。
U-boot 中Universal 有两层含义,一是U-boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器;另外一层含义则是U-boot 不仅仅支持嵌入式Linux 操作系统的引导,还支持OpenBSD, NetBSD, FreeBSD, SVR4, Solaris, VxWorks, LynxOS, pSOS, lrix, RTEMS, QNX, ARTOS 等操作系统的引导。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MPC83xx 的U-boot 启动流程分析和移植董 闯北京邮电大学信息与通信工程学院,北京(100876)E-mail :donix.dong@摘 要:本文首先引入Bootloader 的概念,接着介绍U-boot 这种引导程序,并以Freescale 32位微处理器MPC83xx 为例,结合代码详细分析了U-boot 的启动的各个阶段及最终引导Linux 内核的过程,最后,建立交叉编译环境,针对TC8313E 目标板,给出U-boot 移植与编译的基本步骤。
关键词:U-boot;MPC83xx;交叉编译;移植;嵌入式系统中图分类号:TP393.051.引言引导程序(Bootloader)是系统加电后运行的第一段软件代码,类似于PC 机中的引导加载程序BIOS 。
虽然引导程序仅在系统启动时运行非常短的时间,但对于嵌入式系统来说,这是一个非常重要的组成部分。
通过这段小程序,初始化必要的硬件设备,创建内核需要的一些信息并将这些信息传递给内核,从而将系统的软、硬件环境配置到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。
2. U-boot 介绍目前,嵌入式领域里出现了很多种类的Bootloader ,如Armboot 、Blob 、Redboot 、vivi 和U-boot 等,其中U-boot 是使用最广泛,功能最完善的。
U-boot (Universal Boot Loader)是从PPCBOOT 发展演化而来[1],其源码目录、编译形式与Linux 内核很相似,事实上,不少U-boot 源码就是相应的Linux 内核源程序的简化,尤其是一些设备的驱动程序,这从U-boot 源码的注释中就能体现。
U-boot 中Universal 有两层含义,一是U-boot 除了支持PowerPC 系列的处理器外,还能支持MIPS 、x86、ARM 、NIOS 、XScale 等诸多常用系列的处理器;另外一层含义则是U-boot 不仅仅支持嵌入式Linux 操作系统的引导,还支持OpenBSD, NetBSD, FreeBSD, SVR4, Solaris, VxWorks, LynxOS, pSOS, lrix, RTEMS, QNX, ARTOS 等操作系统的引导。
这两个特点正是U-boot 项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。
就目前来看,U-boot 对PowerPC 系列处理器支持最为丰富,对Linux 的支持最完善。
3. U-boot 启动流程分析大多数Bootloader 都分为阶段1(stage1)和阶段2(stage2)两大部分,U-boot 也不例外。
依赖于CPU 体系结构的代码(如CPU 初始化代码等)通常都放在阶段1 中,这些代码一般由汇编语言实现,有些CPU 还会在这个阶段调用部分的C 函数,例如MPC83xx ;U-boot 的阶段2则用于实现复杂的功能,这部分功能通常用C 语言来实现,具有更好的可读性和移植性。
下面结合MPC83xx 的启动流程进行分析:3.1 U-boot 的stage1中国科技论文在线U-boot stage1的第一段代码通常放在start.S 文件中,它由汇编语言实现。
整个stage1都围绕这段汇编代码展开。
MPC83xx U-boot stage1的启动流程如图3-1所示:图3-1 MPC83xx U-boot stage1的启动流程下面以MPC83xx 的第一段代码(cpu\mpc83xx\start.S )为例,功能分析如下:1)上电复位,读取硬件复位配置字(HRCW);这个操作是MPC83xx 处理器自定义的,CPU 上电复位之后,对应于启动ROM 的片选信号CS0#有效,首先在Flash 的起始地址处读取硬件复位配置字,每次读8位,每四次组成一个32位的配置字,共读取8次,分别组成低32位配置字和高32位配置字,代码如下: .text#define _HRCW_TABLE_ENTRY(w) \.fill 8,1,(((w)>>24)&0xff); \.fill 8,1,(((w)>>16)&0xff); \.fill 8,1,(((w)>> 8)&0xff); \.fill 8,1,(((w) )&0xff)_HRCW_TABLE_ENTRY(CFG_HRCW_LOW)_HRCW_TABLE_ENTRY(CFG_HRCW_HIGH)其中起始地址.text 由board\mpc83xx_board\config.mk 文件定义。
配置字读完,PLL 开始锁定。
2)入口启动,开始执行;一个可执行的Image 必须有一个入口点,并且只能有一个全局入口ENTRY(_start),这个全局入口由链接脚本board\mpc83xx_board\U-boot.lds 确定。
PLL 锁定后,CS0#再次有效,选中Flash ,CPU 地址线上输出mpc83xx 处理器系统复位异常向量对应的地址,开始执行第1条指令,代码如下:globl _start_start:li r19, BOOTFLAG_COLD /* Normal Power-On: Boot from FLASH*/nopb boot_cold. = EXC_OFF_SYS_RESET + 0x10 中国科技论文在线.globl _start_warm_start_warm:li r19, BOOTFLAG_WARM /* Software reboot */b boot_warmboot_cold:lis r4, CONFIG_DEFAULT_IMMR@hnopboot_warm:mfmsr r5 /* save msr contents */lis r3, CFG_IMMR@hori r3, r3, CFG_IMMR@lstw r3, IMMRBAR(r4)3)CPU内核初始化(init_e300_core):首先初始化机器状态;接着关闭看门狗,屏蔽所有中断,代码如下:/* Disable Wathcdog */lwz r4, SWCRR(r3)/* Check to see if its enabled for disabling, once disabled by SW you can't re-enable */ andi. r4, r4, 0x4beq 1fxor r4, r4, r4stw r4, SWCRR(r3)然后关闭所有的TLB,代码如下:/* invalidate all tlb's */li r3, 32mtctr r3li r3, 01: tlbie r3addi r3, r3, 0x1000bdnz 1bSYNC4)重新映射闪存的绝对地址;代码如下:bl map_flash_by_law1lis r4, (CFG_MONITOR_BASE)@hori r4, r4, (CFG_MONITOR_BASE)@laddi r5, r4, in_flash - _start + EXC_OFF_SYS_RESETmtlr r5blrin_flash:#if 1 /* Remapping flash with LAW0. */bl remap_flash_by_law05)使能地址翻译,使能D-Cache并锁定,在CPU内部的Data Cache中,建立堆栈(stack-in-cache)。
因为在没有初始化外部SDRAM之前,只能利用CPU内部的Cache作为内存来继续下一步的初始化,即这一步是为了进一步调用C语言函数进行初始化而建立堆栈,代码如下:/* enable address translation */bl enable_addr_transsync/* enable and invalidate the data cache */bl dcache_enablesync/* Cache must be enabled here for stack-in-cache trick */bl lock_ram_in_cachesync6)堆栈(stack-in-cache)建立好以后,它通过“bl cpu_init_f 语言跳转到\cpu\mpc83xx\cpu_ini.c中的cpu_init_f()函数, 开始第二部分的CPU初始化,这是个C函数,但仍然在Flash中运行。
该函数对所有的CPU内部的寄存器进行初始化,包括初始化内存控制器;7)当寄存器初始化结束以后,它通过“bl board_init_f” 语言跳转到lib_ppc\Board.c中的board_init_f()函数,为全局变量结构体gd分配内存空间,进行初始化序列init_sequence,这些C函数仍然在Flash中运行,目的是:a)为了输出打印信息而尽早提供串口,b)为准备重定位而初始化SDRAM。
然后指针返回到start.S执行。
全局变量结构体gd 主要用来保存开发板信息、终端存在标志位、环境变量结构体起始地址、环境变量校验标志位、frame buffer 基地址等。
它是指向gd_t 结构体的指针,gd_t 结构体定义在Include\asm-ppc\global_data.h中。
初始化序列init_sequence中各函数的作用如下所示:¾ board_early_init_f:基本的板级相关配置,主要包括设置处理器类型和启动参数地址;¾ get_clocks:获得并设置CPU和BUS时钟;¾ init_timebase:初始化计数器;¾ env_init:设置环境变量,初始化环境;¾ init_baudrate:指定串口的波特率;¾ serial_init:串口初始化设置;选择通讯端口,设置串口波特率和工作方式,越早开通串口,对后面的工作越有好处;¾ console_init_f:设置gd->have_console=1,表示可以使用串口通讯控制台;¾ display_banner:在控制台输出 U-boot 信息;¾ checkcpu:检查CPU版本信息;¾ checkboard:检查board信息;¾ init_func_i2c:初始化i2c接口;¾ init_func_ram:初始化SDRAM;8)内存初始化完成以后,返回start.S,重定位,调用relocate_code()函数,将stage2代码从闪存拷贝到RAM里面。