Uboot启动流程国嵌视频培训
- 格式:docx
- 大小:11.27 KB
- 文档页数:7
嵌入式启动流程:汇编代码解析1.加载引导程序嵌入式系统在加电后,第一个执行的程序通常是引导程序(Bootloader)。
它负责从存储设备中加载并执行后续的程序。
引导程序通常在启动时进行硬件设备的自检,然后从特定的存储位置(如闪存或RAM)加载后续程序。
引导程序通常使用汇编语言编写,因为它需要在硬件级别进行操作。
它负责初始化CPU、内存、硬盘等硬件设备,并确保系统环境满足后续程序的要求。
2.初始化硬件设备在引导程序之后,接下来的任务是初始化硬件设备。
这包括初始化CPU、内存、硬盘、显示器等设备。
初始化硬件设备的过程包括设置设备的寄存器、配置设备的接口等。
在这个过程中,硬件设备被配置为适合后续程序运行的状态。
3.设置内存管理器在硬件设备初始化完成后,接下来需要设置内存管理器。
内存管理器负责管理系统的内存资源,包括内存的分配、释放和保护。
内存管理器通常由操作系统内核提供,因此在加载操作系统内核之前,需要先初始化内存管理器。
4.加载操作系统内核在内存管理器初始化完成后,可以加载操作系统内核。
操作系统内核是系统的核心部分,负责管理系统资源、调度应用程序的运行等。
操作系统内核通常被压缩并保存在存储设备中,因此需要先解压缩并加载到内存中。
然后,内核会进行自身的初始化,包括设置系统时钟、配置设备驱动等。
5.启动内核并初始化系统服务在操作系统内核加载并初始化完成后,可以启动内核并初始化系统服务。
系统服务是指为应用程序提供支持的底层服务,如文件系统、网络服务等。
启动内核后,会执行一系列的系统初始化过程,包括设置系统环境变量、加载系统服务等。
这些过程完成后,系统就可以接受应用程序的请求并为其提供服务。
6.加载文件系统和应用程序在系统服务初始化完成后,可以加载文件系统和应用程序。
文件系统是存储和管理文件数据的系统,应用程序则是为用户提供服务的程序。
文件系统通常被加载到内存中,并初始化为可用的状态。
然后,可以按需加载应用程序到内存中并执行。
1嵌入式操作系统启动流程1.在通电后,初始化硬件(bootrom)2.支持VxWorks与硬件驱动通信(Image的底层驱动)3.本质上是硬件驱动、初始化的合集;2研究BSP内容:1.系统image的生成与image的种类2.image的download下载过程3.系统的启动顺序与过程4.调试环境的配置及远端调试的方式与方法5.相应BSP设置文件的修改(网络,串口..)6.BSP各文件的构成与作用.7.要对系统底层驱动清晰,也就是对CPU及有关的硬件有所熟悉.要紧是32微处理器(上电启动过程, download image的方式方法,读写ROM,地址空间分配,MMU,寄存器,中断定义,..).参照硬件资料,多读一些源码会有所帮助.3BSP要紧文件目录的构成及要紧文件的作用:3.1目录target/config/All:这个目录下的文件是所有BSP文件共享的,不是特别需要不要更换里面的任何文件.configAll.h:缺省定义了所有VxWorks的设置.假如不用缺省的设置,可在BSP目录下的config.h文件中用#define或者#undef方式来更换设置.bootInit.c:在romInit.s后,完成Boot ROM的第二步初始化.程序从romInit.s中的romInit()跳到这个文件中的romStart().来执行必要的解压与ROM image的放置.bootConfig.c:完成Boot ROM image的初始化与操纵.usrConfig.c: VxWorks image的初始化代码.3.2目录target/config/comps/src:涉及系统核心的components,要紧由target/config/All中usrConfig.c中函数调用3.3目录target/config/bspname:包含系统或者硬件有关的BSP文件.MakefileREADMEBSP公布纪录,版本,总的文档config.hconfigNet.h网络驱动的要紧设置文件,要紧对END驱动设置.romInit.ssysALib.s汇编语言文件,程序员能够把自己的汇编函数放在这个文件里,在上层调用.VxWorks image的入口点_sysInit在这个文件里,是在RAM中执行的第一个函数.sysLib.c包含一些系统有关的函数例程,提供了一个board-level的接口,VxWorks与应用程序能够以system-indepent的方式生成.这个文件还能包含目录target/config/comps/src的驱动.sysScsi.c可选文件用于Scsi设备设置与初始化.sysSerial.c可选文件用于所有的串口设置与初始化.bootrom.hexASIC文件包含VxWorks Boot ROM代码VxWorks运行在目标机上,完整的,连结后的VxWorks二进制文件.VxWorks.sym完全的,连结后带有符号表的VxWorks二进制文件VxWorks.st完全的,连结后,standalone,带有符号表的VxWorks二进制文件4VxWorks Image4.1VxWorks images consist of:•Text segment---executable instruction.•Data segment---Initilized global and static varibles.•BSS.4.2分类与工作机理:Bootrom不是VxWorks Image,不参与讨论它本质上是一段Boot program,最少的系统初始化,要紧用于启动装载VxWorks image.通常有压缩与不压缩两种形式,如bootrom与boot_uncmp.与VxWorks image的区别在于一个Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c.VxWorks 本质上分为两大类:1.Vxworks分为两大类:1)Uploaded images(通过网口、串口、硬盘、软盘、DOC、ROM中加载到RAM中执行的)vxWorks - basic Tornado, shell 与symbol table 在主机端vxWorks.st(文件很大)- 独立的image,包含shell与symbol table 在目标板运行2)ROM based images(直接烧入ROM的VxWorks):VxWorks_Rom类的Vxworks又分了两类:1)驻留的resident 2)不住留的1.不住留的ROM – Based VxWorks Image2.驻留的VxWorks_rom_resident2.说的再具体点:1)可下载的Vxworks image2)ROM中烧制的Image1.vxWorks_rom - Tornado in ROM,非压缩, 在RAM 中运行2.vxWorks.res_rom_nosym - Tornado in ROM, 非压缩,在ROM 中运行3.vxWorks.st_rom - Stand-alone in ROM, 压缩, RAM 中运行4.vxWorks.res_rom - Stand-alone in ROM, 非压缩, ROM 中运行3.VxWorks在存储介质中的存放方式5启动5.1启动概述1.Bootrom 的启动最少的系统初始化,要紧用于启动装载VxWorks image.通常有压缩与不压缩两种形式,如bootrom与boot_uncmp.与VxWorks image的区别在于一个Bootrom 调用bootConfig.c,而VxWorks调用usrConfig.c.文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件bootConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRo ot,...)其中 /target/config/all/bootConfig.c是Boot ROM设置模块.用于通过网络加载VxWorks image.usrRoot()---->bootCmdLoop(void)命令行选择,或者autobooting----->bootLoad(pLine, &entry)加载模块到内存(网络,TFFS,TSFS...)----->netifAttach()---->go(entry)----->(entry)()从入口开始执行,不返回.•各个函数的要紧作用romInit()-----power up,disable interrupt,put boot type on thestack,clears caches.romStart()-----load Image Segments into RAM.usrInit()-----Interrupt lock out,save imformation about boot type,handle all the Initialization before the kernel is actually started,then starts the kernel execution to create an initial task usrRoot().This task completes the start up.sysHwInit()-----Interrup locked,Initializeshardware,registers,activation kernelKernelInit(usrRoot,...)-----•Initializes and starts the kernel.•Defines system memory partition.•Activates a task tUsrRoot to complete initalization.•Unlocks inierrupts.•Uses usrInit()stack.usrRoot()•初始化内存分区表(memory partition library)•初始化系统系统时钟(system clock)•初始化输入输出系统(I/O system)----可选•Create devices----可选•设置网络(Configure network)--------可选•激活WDB目标通信(Activate WDB agent)---------可选•调用程序(Activate application)2.VxWorks的启动1)Loadable VxWorks的启动a)使用Bootrom进行最小系统起动b)加载程序段、数据段、BBS段c)跳转到RAM中运行的VxWorks的启动(详见下面)2)VxWork_ROM的VxWorks启动1.ROM中运行的VxWorks的启动VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压,系统直接跳到ROM的首地址,运行VxWorks.注意:ROM运行的VxWorks并不支持所有的主扳,应以主扳手册为准.文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件usrConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRo ot,...)VxWorks在ROM中运行要紧是为了节约RAM空间,以便应用程序有更大的空间运行.只把VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行.ROM中运行的VxWorks缺点是运行速度慢.2.RAM中运行的VxWorks的启动VxWorks在RAM中运行,即写入ROM中的Boot或者VxWorks Image是压缩的,需要先解压copy所有的text与data到RAM的LOCAL_LOW_ADRS中,下面sysInit()要紧是初始化RAM用的,系统直接跳到RAM的首地址,运行VxWorksusrInit()前面不压缩,即romInit(),romStart()不能压缩.文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->sysaLib.s中的sysInit()---->文件usrConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRo ot,...)RAM运行的Boot或者VxWorks image的text段或者data段会从ROM复制到RAM,在RAM中运行.其中usrRoot()是VxWorks启动的第一个任务,由它来初始化 driver,network等描述:romInit.s first execute in flash,minal initiliz,then jump to romStart.romStart()开始装载与解压image到RAM,sysaLib.s是在RAM中执行的第一个函数.。
uboot启动流程分析Uboot启动流程分析。
Uboot是一种常用的嵌入式系统启动加载程序,它的启动流程对于嵌入式系统的正常运行至关重要。
本文将对Uboot启动流程进行分析,以便更好地理解其工作原理。
首先,Uboot的启动流程可以分为以下几个步骤,Reset、初始化、设备初始化、加载内核。
接下来我们将逐一进行详细的分析。
Reset阶段是整个启动流程的起点,当系统上电或者复位时,CPU会跳转到Uboot的入口地址开始执行。
在这个阶段,Uboot会进行一些基本的硬件初始化工作,包括设置栈指针、初始化CPU寄存器等。
接着是初始化阶段,Uboot会进行一系列的初始化工作,包括初始化串口、初始化内存控制器、初始化时钟等。
这些初始化工作是为了确保系统能够正常地运行,并为后续的工作做好准备。
设备初始化阶段是Uboot启动流程中的一个重要环节,它包括对外设的初始化和检测。
在这个阶段,Uboot会初始化各种外设,如网卡、存储设备等,并对其进行检测,以确保它们能够正常工作。
最后一个阶段是加载内核,Uboot会从存储设备中加载操作系统的内核镜像到内存中,并跳转到内核的入口地址开始执行。
在这个过程中,Uboot会进行一些必要的设置,如传递启动参数给内核,并最终将控制权交给内核。
总的来说,Uboot的启动流程是一个非常重要的过程,它涉及到系统的硬件初始化、外设的初始化和内核的加载等工作。
只有当这些工作都顺利完成时,系统才能够正常地启动运行。
因此,对Uboot启动流程的深入理解对于嵌入式系统的开发和调试具有重要意义。
通过本文对Uboot启动流程的分析,相信读者对Uboot的工作原理有了更清晰的认识。
希望本文能够对大家有所帮助,谢谢阅读!。
此文来源:赵春江老师的CNSD博客,希望帮到更多的人:/zhaocju-boot支持许多CPU,以及一些常见的开发板。
本文以u-boot-2019.06这个最新版本为例,简要介绍一下u-boot在smdk2410上的启动流程。
首先系统是从arch/arm/cpu/arm920t目录下的start.s文件开始执行,并且实际开始执行的代码是从第117行开始:117:start_code:118:/*119:* set the cpu to SVC32 mode120:*/121:mrs r0, cpsr122:bic r0, r0, #0x1f123:orr r0, r0, #0xd3124:msr cpsr, r0上述代码的含义是设置cpu为SVC32模式,即超级保护模式,用于操作系统使用。
140:#ifdef CONFIG_S3C24X0141:/* turn off the watchdog */142:143:# if defined(CONFIG_S3C2400)144:# define pWTCON 0x15300000145:# define INTMSK 0x14400008 /* Interupt-Controller base addresses */146:# define CLKDIVN 0x14800014 /* clock divisor register */148:# define pWTCON 0x53000000149:# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ 150:# define INTSUBMSK 0x4A00001C151:# define CLKDIVN 0x4C000014 /* clock divisor register */152:# endif153:154:ldr r0, =pWTCON155:mov r1, #0x0156:str r1, [r0]157:158:/*159:* mask all IRQs by setting all bits in the INTMR - default160:*/161:mov r1, #0xffffffff162:ldr r0, =INTMSK163:str r1, [r0]164:# if defined(CONFIG_S3C2410)165:ldr r1, =0x3ff166:ldr r0, =INTSUBMSK167:str r1, [r0]169:170:/* FCLK:HCLK:PCLK = 1:2:4 */171:/* default FCLK is 120 MHz ! */172:ldr r0, =CLKDIVN173:mov r1, #3174:str r1, [r0]175:#endif /* CONFIG_S3C24X0 */该段代码的含义为,先定义几个需要的寄存器,然后关闭开门狗定时器,以及屏蔽所有中断和子中断,最后设置三个时钟频率之间的比值。
详细的boorloader的移植(1)北京顶嵌嵌入式培训机构 2009-09-14 16:52:23 作者:赵老师来源:顶嵌技术部文字大小:[大][中][小]一.BootLoader简介简单的说bootloader是一段程序,它的作用就是加载操作系统,BootLoader(引导加载程序)是系统加电后运行的第一段软件代码。
通过这段代码实现硬件的初始化,建立内存空间的映射图,为操作系统内核准备好硬件环境并引导内核的启动。
如右图所示的那样在设备的启动过程中bootloader位于最底层,首先被运行来引导操作系统运行,很容易可以看出 bootloader是底层程序所以它的实现严重地依赖于硬件,特别是在嵌入式世界。
因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。
尽管如此,一些功能强大、支持硬件环境较多的BootLoader也被广大的使用者和爱好者所支持,从而形成了一些被广泛认可的、较为通用的的bootlo ader实现。
简单的介绍几种:1.U-BOOTuboot是一个庞大的公开源码的软件。
他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。
其代码可以从下载U-BOOT是由PPCBO OT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案,从官方版本0.3.2开始全面支持SC系列单板机。
u-boot是一个开源的bootloader。
2.vivivivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。
Vivi有两种工作模式:启动加载模式和下载模式。
启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这是vivi的默认模式。
如果修改或更新需要进入下载模式,在下载模式下,vivi为用户提供一个命令行接口通过接口可以使用vivi提供的一些命令,来实现flash的烧写、管理、操作mtd分区信息、启动系统等功能。
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)加载模块内核启动后加载模块,模块提供了丰富的功能,如网络支持、图形界面等。
(一)U-Boot启动过程--详细版的完全分析我们知道,bootloader是系统上电后最初加载运行的代码。
它提供了处理器上电复位后最开始需要执行的初始化代码。
在PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例如LILO或GRUB),并进一步引导操作系统的启动。
然而在嵌入式系统中通常没有像BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成。
它主要的功能是加载与引导内核映像一个嵌入式的存储设备通过通常包括四个分区:第一分区:存放的当然是u-boot第二个分区:存放着u-boot要传给系统内核的参数第三个分区:是系统内核(kernel)第四个分区:则是根文件系统如下图所示:u-boot是一种普遍用于嵌入式系统中的Bootloader。
Bootloader介绍Bootloader是进行嵌入式开发必然会接触的一个概念,它是嵌入式学院<嵌入式工程师职业培训班>二期课程中嵌入式linux系统开发方面的重要内容。
本篇文章主要讲解Bootloader 的基本概念以及内部原理,这部分内容的掌握将对嵌入式linux系统开发的学习非常有帮助!Bootloader的定义:Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。
具体在Bootloader中完成了哪些操作我们会在后面分析到,这里我们先来回忆一下PC的体系结构:PC机中的引导加载程序是由BIOS和位于硬盘MBR中的OS Boot Loader(比如LILO和GRUB等)一起组成的,BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。
uboot开发流程U-Boot 开发流程U-Boot 是一个用于启动嵌入式系统的大约 40KB 的嵌入式固件。
它在系统启动过程中通常作为第一个软件组件被加载和执行,负责初始化硬件、加载内核并将其传递给内核。
开发 U-Boot 的步骤:1. 获取 U-Boot 源代码从 U-Boot 官方网站下载最新版本的 U-Boot 源代码。
2. 设置开发环境安装必要的工具链和依赖项,例如交叉编译器、Make 和 Perl。
还要创建一个用于开发和构建 U-Boot 的工作区。
3. 配置 U-Boot打开 U-Boot 配置文件(通常为 'config.h'),并根据您的特定板配置选项,例如板类型、内存大小和外围设备。
4. 编译 U-Boot使用 'make' 命令编译 U-Boot。
5. 调试 U-Boot使用 'gdb' 等调试器调试 U-Boot 代码,并修复任何编译错误或运行时问题。
6. 设置和测试 NAND/NOR 闪存配置 U-Boot 以使用 NAND 或 NOR 闪存,并通过写入和验证图像来测试该配置。
7. 集成 U-Boot 到板级支持包 (BSP)将编译后的 U-Boot 图像集成到您的 BSP 中,这是一个用于支持特定硬件板的软件包。
8. 在目标板上测试 U-Boot将 BSP 部署到目标板,并测试 U-Boot 是否可以正确启动系统。
9. 个性化 U-Boot根据您的特定需求定制 U-Boot 的命令行和功能,例如添加自定义命令或修改环境变量。
10. 维护 U-Boot随着时间的推移,跟踪和应用 U-Boot 社区的更新和补丁,以确保您的开发保持最新且安全。
提示:遵循 U-Boot 文档并充分利用社区支持。
使用版本控制系统来跟踪您的更改。
彻底测试您的代码以确保其稳定性。
保持 U-Boot 与您的目标板紧密集成。
定期更新 U-Boot 以利用最新功能和安全改进。
面试 uboot的启动流程英文回答:The boot process of U-Boot can be divided into several stages. First, when the system is powered on, the CPUstarts executing the initial bootstrap code stored in the ROM. This code is responsible for initializing the CPU and memory, and then it transfers control to the second stage bootloader, which is typically stored in some non-volatile memory like flash or SD card.In the second stage, the bootloader performs some basic hardware initialization, such as setting up the clocks, enabling the cache, and configuring the memory controller. It then loads the U-Boot image from the storage device into the RAM and transfers control to it.Once U-Boot is running, it performs further initialization, such as setting up the environment variables and initializing the drivers for the peripherals.It also provides a command-line interface for interacting with the user.After the initialization is complete, U-Boot executes the boot script, which is a set of commands that define the boot process. This script typically sets up the kernel command line and loads the kernel image from the storage device into the RAM.Finally, U-Boot transfers control to the loaded kernel image, which starts the operating system and continues the boot process.中文回答:U-Boot的启动流程可以分为几个阶段。
U-Boot启动过程
(国嵌2440培训)
开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启
动函数。
看一下board/smdk2410/这个链接脚本,可以知道目标程序
的各部分链接顺序。
第一个要链接的是cpu/arm920t/,那么U-Boot
的入口指令一定位于这个程序中。
下面分两阶段介绍启动流程:
第一阶段
1.cpu/arm920t/
这个汇编程序是U-Boot的入口程序,开头就是复位向量的代码。
_start: b reset 1f. */
add r0, r0, #4
cmp r0, r1
bne clbss_l
/* 跳转到start_armboot函数入口,_start_armboot字保存函数入
口指针 */
ldr pc, _start_armboot
_start_armboot: .word start_armboot 3c3c.\n", addr);
rc = ((ulong (*)(int, char []))addr) (--argc, &argv[1]); /* 运行程序 */
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lX\n", rc); /*如果是运行linux,这条指令是否能运行?*/
return rcode;
}
go命令调用do_go()函数,跳转到某个地址执行的。
如果在这个地址准备好了自引导的内核映像,就可以启动了。
尽管go命令可以带变参,实际使用时不用来传递参数。
2.bootm命令的实现
/* common/ */
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char
*argv[])
{
…… ……
/* 检查头部 */
if (crc32 (0, (uchar *)data, len) != checksum) {
puts ("Bad Header Checksum\n");
SHOW_BOOT_PROGRESS (-2);
return 1;
}
…… ……
/*解压缩*/
switch (hdr->ih_comp) {
case IH_COMP_NONE:
if(ntohl(hdr->ih_load) == addr) {
printf (" XIP %s ... ", name);
} else {
#if defined(CONFIG_HW_WATCHDOG) ||
defined(CONFIG_WATCHDOG)
size_t l = len;
void *to = (void *)ntohl(hdr->ih_load);
void *from = (void *)data;
printf (" Loading %s ... ", name);
while (l > 0) {
size_t tail = (l > CHUNKSZ) ? CHUNKSZ : l;
WATCHDOG_RESET();
memmove (to, from, tail);
to += tail;
from += tail;
l -= tail;
}
#else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */ memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);
#endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */ }
break;
case IH_COMP_GZIP:
printf (" Uncompressing %s ... ", name);
if (gunzip ((void *)ntohl(hdr->ih_load), unc_len, (uchar *)data, &len) != 0) {
puts ("GUNZIP ERROR - must RESET board to recover\n");
SHOW_BOOT_PROGRESS (-6);
do_reset (cmdtp, flag, argc, argv);
}
break;
#ifdef CONFIG_BZIP2
case IH_COMP_BZIP2:
printf (" Uncompressing %s ... ", name);
/*
* If we've got less than 4 MB of malloc() space,
* use slower decompression algorithm which requires
* at most 2300 KB of memory.
*/
i = BZ2_bzBuffToBuffDecompress
((char*)ntohl(hdr->ih_load),
&unc_len, (char *)data, len,
CFG_MALLOC_LEN < (4096 * 1024), 0);
if (i != BZ_OK) {
printf ("BUNZIP2 ERROR %d - must RESET board to recover\n", i);
SHOW_BOOT_PROGRESS (-6);
udelay(100000);
do_reset (cmdtp, flag, argc, argv);
}
break;
#endif /* CONFIG_BZIP2 */
default:
if (iflag)
enable_interrupts();
printf ("Unimplemented compression type %d\n", hdr->ih_comp);
SHOW_BOOT_PROGRESS (-7);
return 1;
}
}
…… …… ……
switch (hdr->ih_os) {
default: /* handled by (original) Linux case */
case IH_OS_LINUX:
do_bootm_linux (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
case IH_OS_NETBSD:
do_bootm_netbsd (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
case IH_OS_RTEMS:
do_bootm_rtems (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
case IH_OS_VXWORKS:
do_bootm_vxworks (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
case IH_OS_QNX:
do_bootm_qnxelf (cmdtp, flag, argc, argv,
addr, len_ptr, verify);
break;
}
bootm命令调用do_bootm函数。
这个函数专门用来引导各种操作系统映像,可以支持引导Linux、vxWorks、QNX等操作系统。
引导Linux 的时候,调用do_bootm_linux()函数。
3.do_bootm_linux函数的实现
/* lib_arm/ */
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
ulong addr, ulong *len_ptr, int verify)
{
theKernel = (void (*)(int, int,
uint))ntohl(hdr->ih_ep);
… … … …
/* we assume that the kernel is in place */
printf ("\nStarting kernel ...\n\n");
… … … …
theKernel (0, bd->bi_arch_number, bd->bi_boot_params); /*启动内核,传递启动参数*/
}
do_bootm_linux()函数是专门引导Linux映像的函数,它还可以处理ramdisk文件系统的映像。
这里引导的内核映像和ramdisk映像,必须是U-Boot格式的。
U-Boot格式的映像可以通过mkimage工具来转换,其中包含了U-Boot可以识别的符号。