bootloader分析
【精编推荐】bootloader代码分析报告

【精编推荐】bootloader代码分析报告Bootloader代码分析报告徐凯2007-8-3Bootloader代码分析报告 (1)1.启动代码分析 (1)1.1.vector.s代码分析 (1)1.1.1.宏定义 (5)1.1.3.判断是否是thumb指令 (6)1.1.4.定义新程序、引入新符号 (6)1.1.5.定义新程序、引入新符号 (7)1.1.6.定义系统异常向量表 (7)1.1.7.程序跳转宏定义 (7)1.1.8.异常处理程序定义 (7)1.1.9.声明C主函数程序入口 (10)1.1.10.定义vector.s中需要用到的连接器变量 (10)1.1.11.定义从FLASH启动程序的函数 (11)1.2.sysinit.s代码分析 (11)1.2.1.引入S3C4510相关系统配置寄存器的地址 (18)1.2.2.定义用于配置ROM和RAM的宏 (18)1.2.3.定义用于配置SYSCFG的宏 (18)1.2.4.定义用于初始化内存的函数InitMemory (18)1.2.5.定义用于初始化内存的函数InitMemory (20)1.2.6.定义内存重设置函数ResetMemSet (21)1.2.7.初始化21种中断源响应函数InitInterrupt (21)1.2.8.初始化18个外部I/O端口函数InitPort (21)1.2.9.初始化2个计时器的函数InitTimer (22)1.2.10.初始化2个串口函数InitUart (22)1.2.11.初始化栈函数InitStack (23)1.2.12.系统初始化函数InitSystem (24)1.启动代码分析1.1.vector.s代码分析由于连接器参数中有-first vector.o,所以先从这个文件开始分析。
首先,列出源代码:1ModeMask EQU 0x1F2SVC32Mode EQU 0x133IRQ32Mode EQU 0x124FIQ32Mode EQU 0x115User32Mode EQU 0x106Abort32Mode EQU 0x177Undef32Mode EQU 0x1B8IRQ_BIT EQU 0x809FIQ_BIT EQU 0x4010;RomBaseAddr EQU 011RamBaseAddr EQU &10012;RamEndAddr EQU &20013GBLS MainEntry14MainEntry SETS "main"15IMPORT $MainEntry16;**********************************************************17;シ・鯡ヌキケモテtasm.exeスミア默・18GBLL THUMBCODE19[ {CONFIG} = 1620THUMBCODE SETL {TRUE}21CODE3222|23THUMBCODE SETL {FALSE}24]2526[ THUMBCODE27CODE32 ;for start-up code for Thumb mode28]2930;******************************************************31AREA SelfBoot, CODE, READONL Y3233IMPORT UDF_INS_VECTOR34IMPORT SWI_SVC_VECTOR35IMPORT INS_ABT_VECTOR36IMPORT DAT_ABT_VECTOR37IMPORT IRQ_SVC_VECTOR38IMPORT FIQ_SVC_VECTOR3940ENTRY41IF :DEF: |ads$version|42ELSE43EXPORT __main44__main45ENDIF46ResetEntry47 b SYS_RST_HANDLER48 b UDF_INS_HANDLER49 b SWI_SVC_HANDLER50 b INS_ABT_HANDLER51 b DAT_ABT_HANDLER52 b .53 b IRQ_SVC_HANDLER54 b FIQ_SVC_HANDLER5556;****************************************************** 57MACRO58$Label HANDLER $Vector59$Label60sub lr, lr, #461stmfd sp!, {r0-r3, lr}62ldr r0, =$Vector63ldr pc, [r0]64ldmfd sp!, {r0-r3, pc}^65MEND6667UDF_INS_HANDLER68stmfd sp!, {r0-r3, lr}69ldr r0, =UDF_INS_VECTOR70mov lr, pc71ldr pc, [r0]72ldmfd sp!, {r0-r3, pc}^73SWI_SVC_HANDLER74stmfd sp!, {r0-r3, lr}75ldr r0, =SWI_SVC_VECTOR76mov lr, pc77ldr pc, [r0]78ldmfd sp!, {r0-r3, pc}^79INS_ABT_HANDLER80sub lr, lr, #481stmfd sp!, {r0-r3, lr}82ldr r0, =INS_ABT_VECTOR83mov lr, pc84ldr pc, [r0]85ldmfd sp!, {r0-r3, pc}^86DA T_ABT_HANDLER87sub lr, lr, #488stmfd sp!, {r0-r3, lr}89ldr r0, =DAT_ABT_VECTOR90mov lr, pc91ldr pc, [r0]92ldmfd sp!, {r0-r3, pc}^93IRQ_SVC_HANDLER94sub lr, lr, #495stmfd sp!, {r0-r12, lr}96mrs r0, spsr97stmfd sp!, {r0}98ldr r0, =IRQ_SVC_VECTOR99ldr pc, [r0]100FIQ_SVC_HANDLER101sub lr, lr, #4102stmfd sp!, {r0-r12, lr}103mrs r0, spsr104stmfd sp!, {r0}105ldr r0, =IRQ_SVC_VECTOR106ldr pc, [r0]107108;******************************************************* 109SYS_RST_HANDLER110mrs r0, cpsr ;enter svc mode and disable irq,fiq 111bic r0, r0, #ModeMask112orr r0, r0, #(SVC32Mode :OR: IRQ_BIT :OR: FIQ_BIT)113msr cpsr_c, r0114115IMPORT InitSystem116bl InitSystem117118adr r0, ResetEntry119mov r3, #(RamBaseAddr<<16)120ldr r1, BaseOfROM121ldr r2, TopOfROM122add r1, r1, r3123add r2, r2, r31240125ldmia r0!, {r4-r11}126stmia r1!, {r4-r11}127cmp r1, r2128bcc %B0129130sub r1, r1, r2131sub r0, r0, r1132ldr r1, BaseOfBSS133ldr r2, BaseOfZero134add r1, r1, r3135add r2, r2, r31361137cmp r1, r2138ldrccr4, [r0], #4139strcc r4, [r1], #4140bcc %B1141142mov r0, #0143ldr r2, EndOfBSS144add r2, r2, r31453146cmp r1, r2147strcc r0, [r1], #4148bcc %B3149150IMPORT RemapMemory151152adr r0, ResetEntry153ldr r1, =RemapMemory154ldr r2, BaseOfROM155sub r2, r1, r2156add r0, r0, r2157add r1, r2, r3158mov r2, #321590160ldr r3, [r0], #4161str r3, [r1], #4162subs r2, r2, #1163bne %B0164165ldr lr, GotoMain166b RemapMemory167168GotoMain DCD $MainEntry169170;***********************************************171IMPORT |Image$$RO$$Base| ; ROM code start172IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program 173IMPORT |Image$$RW$$Base| ; Pre-initialised variables174IMPORT |Image$$ZI$$Base| ; uninitialised variables175IMPORT |Image$$ZI$$Limit| ; End of variable RAM space176177BaseOfROM DCD |Image$$RO$$Base|178TopOfROM DCD |Image$$RO$$Limit|179BaseOfBSS DCD |Image$$RW$$Base|180BaseOfZero DCD |Image$$ZI$$Base|181EndOfBSS DCD |Image$$ZI$$Limit|182183;***********************************************184TIP_SIZE EQU 256185186IMPORT ResetMemSet187EXPORT trans_to_boot188trans_to_boot189mov lr, r1 ; a2 = r1190ldr r1, =ResetMemSet191ldr r2, BaseOfROM192sub r2, r1, r2193add r0, r0, r2 ; a1 = r0194mov r2, #TIP_SIZE1950196ldr r3, [r1], #4197str r3, [r0], #4198subs r2, r2, #1199bne %B0200201sub r0, r0, #TIP_SIZE*4202mov pc, r0203204;***********************************************205206END1.1.1.宏定义1 ModeMask EQU 0x1F2 SVC32Mode EQU 0x133 IRQ32Mode EQU 0x124 FIQ32Mode EQU 0x115 User32Mode EQU 0x106 Abort32Mode EQU 0x177 Undef32Mode EQU 0x1B8 IRQ_BIT EQU 0x809 FIQ_BIT EQU 0x4010 ;RomBaseAddr EQU 011 RamBaseAddr EQU &10012 ;RamEndAddr EQU &200行1定义了CPSR中表示模式位的5位。
BootLoader启动过程分析

BootLoader启动过程分析一、 Boot Loader的概念和功能1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。
而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。
有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART 或以太网等等。
而S3C24x0则很简单,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。
包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。
用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的一般分布如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。
2、在嵌入式Linux中为什么要有BootLoader在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:【1】CPU寄存器设置:R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内核启动参数在RAM中起始基地址;【2】CPU模式:必须禁止中断(IRQs和FIQs);CPU 必须工作在是超级保护模式(SVC) 模式;【3】Cache和MMU的设置:MMU 必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。
bootloader启动代码分析

bootloader启动代码分析1,bootloader(第一部分)主要完成以下工作:1,设置CPU工作模式;2,关闭中断;3,关闭Cache和Write buffer;4,初始化SDRAM,配置存储设备;5,复制FLASH中的代码和数据到SDRAM中;6,内存重映射,配置存储设备;7,把RM和ZI从LOAD ADDR 复制到execute ADDR.8,设置栈空间指针,跳转到C语言函数入口(启动代码第二部分)。
2,具体代码分析1,设置CPU工作模式MRS r0, cpsr#读取CPSR状态寄存器的值CPSR状态寄存器结构:BIC r0, r0, #MASK_MODE&定义值为0x0000003F,把MODE清零;ORR r0, r0, #MODE_SVC32&宏定义值为0x00000013,把MODE设置为SVC模式;ORR r0, r0, #I_BIT&宏定义值为0x80,关IRQ;ORR r0, r0, #F_BIT&宏定义值为0x40,关FIQ;MSR cpsr_c, r0&回写cpsr状态寄存器设置完CPSR后,状态寄存器中的值:2,关闭中断LDR r2, =ARM7_INTMASK& ARM7_INTMASK宏定义值为ASIC_BASE+0x4008,读取interrupt controller寄存器MVN r1, #0&FFFFFFFFSTR r1, [r2]&回写interrupt controller寄存器,之后寄存器的值为全1,既关闭所有的中断源;LDR r2, =ARM7_INTPEND&ARM7_INTPEND宏定义值为ASIC_BASE+0x4004,取interrupt pend 寄存器.MVN r1, #0 &FFFFFFFFSTR r1, [r2]&回写ARM7_INTPEND寄存器,之后寄存器的值为全1,既关闭所有的中断标志位;3,关闭Cache和Write bufferASIC_BASE宏定义值为0x03ff0000LDR r0, =ARM7_SYSCFG &宏定义值为ASIC_BASE+0x0000LDR r1, =0x87ffffA00X87ffffA0的二进制为 1000 0111 1111 1111 1111 1111 1010 0000 SE Must be set to zero.CE When set to '1', cache operations are enabled. 设置为0,将CACHE禁用。
第二章--Bootloader启动流程分析

为运行域地址,通常为 RAM 的高端地址)测试内存空间是否有效; ③ 复制 Bootloader 的 stage2 代码到 RAM 空间中; ④ 设置好堆栈; ⑤ 跳转到 stage2 的 C 函数入口点。
/* 设置内存起始地址 */ params->u.mem.start = bd->bi_dram[i].start;
/* 设置内存大小 */ params->u.mem.size = bd->bi_dram[i].size; /* 使 params 指向下一个标记 */ params = tag_next (params); } }
标记的数据结构为 tag,它由一个 tag_header 结构体和一个联合体组成。
tag_header 结构体表示标记的长度和类型,比如是表示内存还是命令行参数。
对于不同类型的标记使用不同的联合体。对于 tag 和 tag_header 的定义可以在
网蜂提供的 U-Boot 的源码中 arch/arm/include/asm/setup.h 文件中找到,即:
/* 使 params 指向下一个标记 */ params = tag_next (params); }
static void setup_memory_tags (bd_t *bd) {
int i; for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
/* 设置内存标记 */ params->hdr.tag = ATAG_MEM; params->hdr.size = tag_size (tag_mem32);
Bootloader技术分析

Bootloader的特点
Bootloader启动可以是单阶段或多阶段,代 码可以都在flash中运行,或者一部分在flash 中运行,另一部分在ram中运行
一般bootloader至少有一部分在flash中运行, 但有少数例外(需要处理器支持)
一般bootloader有“引导”和“下载”两种 工作模式
U-boot所使用的文件格式
U-boot的tools目录提供一个工具 mkimage用来将elf格式的image文件转 成uImage
1. Vmlinux elf格式 2. zImage和bzImage 经过压缩的image 3. 用objcopy可以将elf转成bin文件
U-boot下载映像的制作过程
采用两级启动方式的Bootloader
Stage2:完成诸如命令处理等更加复杂的 功能,通常用C语言完成
1. 初始化本阶段需要用到的其他硬件设备 2. 准备系统内存映射 3. 将操作ห้องสมุดไป่ตู้统内核从Flash中搬移到RAM中 4. 为内核设置启动参数 5. 调用内核入口函数
Bootloader结构
处理器启动初始化代码及中断向量表 必要的设备管理机制和驱动函数 对传输协议的支持
由于需要完成“下载”功能,需要同主机 之间进行文件传输,所以需要支持至少某 种文件传输协议和相应的驱动程序,一般 通过串口,需要支持 xmodem/ymodem/zmodem等,当然 通过网络也是一个较好的选择
Bootloader结构
由于bootloader在工作过程中(尤其是调 试阶段)需要与开发者进行交互,所以提 供一个用户界面是必要的,通常通过串口 终端的方式来完成
在多数基于 Intel 的计算机中,GRUB 和 LILO 要 接受由 BIOS 所强加的限制。例如,多数 BIOSes 无法进入两个以上的硬盘,而且它们无法访问任一 驱动器上在超越柱面 1023 以上所贮存的数据。但 是,某些新的 BIOSes 没有这些限制。
bootloader代码分析报告

bootloader代码分析报告文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。
Bootloader代码分析报告徐凯2007-8-3Bootloader代码分析报告 ............................................................................. 错误!未定义书签。
1.启动代码分析................................................................................... 错误!未定义书签。
1.1.vector.s代码分析.................................................................. 错误!未定义书签。
1.1.1.宏定义............................................................................... 错误!未定义书签。
1.1.3.判断是否是thumb指令................................................... 错误!未定义书签。
1.1.4.定义新程序、引入新符号............................................... 错误!未定义书签。
1.1.5.定义新程序、引入新符号............................................... 错误!未定义书签。
1.1.6.定义系统异常向量表....................................................... 错误!未定义书签。
1.1.7.程序跳转宏定义............................................................... 错误!未定义书签。
4510 bootloader的实现与分析

4510B BOOTLOADER (uCLinux)的实现与分析前段时间,写了一个简单直接的4510B bootloader用来装载uclinux内核。
在这篇文档里,我将结合源代码介绍一下4510 Bootloader的实现和分析。
源代码很简单很直接,希望对初学的朋友有点帮助。
也许在分析中有很多错误,希望大家能够指正,共同进步。
Bootloader的实现基于三星4510B,假设开发板上有2M的Flash作为Boot rom,SDRAM 的大小是16M。
开发环境是ADS1.2。
一.相关介绍1.Bootloader 的基本任务Bootloader一般是被烧录或者下载到bootrom的0x0地址处,作为上电后执行的第一部分指令,bootloader需要完成两个任务:(1). memory remap, (2). 把kernel装载到SDRAM里合适的位置上去。
在完成这两个任务后,bootloader就“功成身退”了。
下面的讨论都只围绕这两个任务进行。
其他跟这两个不相关的东东不在介绍范围之内,相关的东东我都会顺带介绍。
2. 4510B开发板上的存储介质一块4510B开发板上,一般有三种存储介质:FLASH,SDRAM和4510片内的SRAM。
FLASH一般是只读的(只在运行的时候),而且一般都作为bootrom使用,因为FLASH 里存储的内容在掉电的时候也不会丢失,所以flash很适合作为bootrom,用来保存bootloader。
SDRAM,大家应该都很熟悉的,是可读写的存储介质,速度比FLASH快的多,在系统运行的时候,SDRAM是主要的存储介质。
但SDRAM里的数据在掉电后即消失,无法用来保存数据。
所以每次启动的时候都需要bootloader将内核装重新装载到SDRAM里去。
在4510的片内还集成了8k的SRAM,SRAM也是可读写的,一般作为系统的cache使用。
3.一般程序结构简单来说,一般的可执行程序都包括代码段、数据段和BSS段。
实验12 Bootloader分析

实验十二 Bootloader分析本次实验将介绍两种bootloader:u-boot和vivi的移植方法,并教大家如何编译vivi。
1. U-BOOT简介U-BOOT是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。
目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是/projects/U-BOOT。
1.1 U-BOOT源代码目录结构◆ board:和一些已有开发板有关的文件,比如Makefile和u-boot.lds等都和具体开发板的硬件和地址分配有关。
◆ common:与体系结构无关的文件,实现各种命令的C文件。
◆ cpu:CPU相关文件,其中的子目录都是以U-BOOT所支持的CPU为名,比如有子目录arm926ejs、mips、mpc8260和nios等,每个特定的子目录中都包括cpu.c和interrupt.c,start.S。
其中cpu.c初始化CPU、设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常,比如快速中断、开关中断、时钟中断、软件中断、预取中止和未定义指令等;start.S 是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。
◆ disk:disk驱动的分区处理代码。
◆:文档。
doc◆:通用设备驱动程序,比如各种网卡、支持CFI的Flash、串口和USB总线等。
drivers◆ fs:支持文件系统的文件,U-BOOT现在支持cramfs、fat、fdos、jffs2和registerfs。
◆:头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支 include持的文件。
◆:与网络有关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Bootloader分析⏹熟悉BootLoader的实现原理⏹认识Bootloader的主要任务⏹熟悉BootLoader的结构框架⏹U-boot使用引言本章详细地介绍了基于嵌入式系统中的OS启动加载程序――BootLoader的概念、软件设计的主要任务以及结构框架等内容。
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:⏹1.引导加载程序。
包括固化在固件(firmware)中的boot代码(可选),和Boot Loader两大部分。
⏹2.Linux内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
⏹3.文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ram disk来作为root fs。
⏹4.用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:MicroWindows和MiniGUI。
⏹引导加载程序是系统加电后运行的第一段软件代码。
回忆一下PC的体系结构我们可以知道,PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS Boot Loader(比如,LILO和GRUB等)一起组成。
⏹BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS Boot Loader。
Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Boot Loader来完成。
⏹比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。
⏹系统的启动通常有两种方式,一种是可以直接从Flash启动,另一种是可以将压缩的内存映像文件从Flash(为节省Flash资源、提高速度)中复制、解压到RAM,再从RAM启动。
⏹当电源打开时,一般的系统会去执行ROM(应用较多的是Flash)里面的启动代码。
这些代码是用汇编语言编写的,其主要作用在于初始化CPU和板上的必备硬件如内存、中断控制器等。
有时候用户还必须根据自己板子的硬件资源情况做适当的调整与修改。
⏹系统启动代码完成基本软硬件环境初始化后,对于有操作系统的情况下,启动操作系统、启动内存管理、任务调度、加载驱动程序等,最后执行应用程序或等待用户命令;对于没有操作系统的系统直接执行应用程序或等待用户命令。
Bootloader概述⏹简单地说,Boot Loader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
⏹通常,Boot Loader是严重地依赖于硬件而实现的,特别是在嵌入式世界。
因此,在嵌入式世界里建立一个通用的Boot Loader几乎是不可能的。
尽管如此,我们仍然可以对Boot Loader归纳出一些通用的概念来,以指导用户特定的Boot Loader设计与实现。
⏹1.Boot Loader所支持的CPU和嵌入式板⏹每种不同的CPU体系结构都有不同的Boot Loader。
有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM 体系结构和MIPS体系结构。
⏹除了依赖于CPU的体系结构外,Boot Loader实际上也依赖于具体的嵌入式板级设备的配置。
这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行在一块板子上的Boot Loader程序也能运行在另一块板子上,通常也都需要修改Boot Loader的源程序。
⏹3.用来控制Boot Loader的设备或机制⏹主机和目标机之间一般通过串口建立连接,Boot Loader软件在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。
⏹4.Boot Loader的启动过程是单阶段(Single Stage)还是多阶段(Multi-Stage)⏹通常多阶段的Boot Loader能提供更为复杂的功能,以及更好的可移植性。
从固态存储设备上启动的Boot Loader大多都是2阶段的启动过程,也即启动过程可以分为stage1和stage2两部分。
而至于在stage1和stage2具体完成哪些任务将在下面讨论。
⏹5.Boot Loader的操作模式(Operation Mode)⏹大多数Boot Loader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。
但从最终用户的角度看,Boot Loader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
⏹启动加载(Boot loading)模式:⏹这种模式也称为“自主”(Autonomous)模式。
也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
⏹下载(Downloading)模式:⏹在这种模式下,目标机上的Boot Loader将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。
⏹6.BootLoader与主机之间进行文件传输所用的通信设备及协议⏹最常见的情况就是,目标机上的Boot Loader通过串口与主机之间进行文件传输,传输协议通常是xmodem/ymodem/zmodem协议中的一种。
⏹但是,串口传输的速度是有限的,因此通过以太网连接并借助TFTP协议来下载文件是个更好的选择。
在通过以太网连接和TFTP协议来下载文件时,主机方必须有一个软件用来的提供TFTP服务。
BootLoader的结构框架⏹假定内核映像与根文件系统映像都被加载到RAM中运行.⏹另外,由于Boot Loader的实现依赖于CPU的体系结构,因此大多数Boot Loader都分为stage1和stage2两大部分。
⏹依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
⏹而stage2则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
⏹Bootloader的stage1⏹Boot Loader的stage1通常包括以下步骤(以执行的先后顺序):⏹(1)硬件设备初始化。
⏹(2)为加载Boot Loader的stage2准备RAM空间。
⏹(3)拷贝Boot Loader的stage2到RAM空间中。
⏹(4)设置好堆栈。
⏹(5)跳转到stage2的C入口点。
⏹Bootloader的stage2(1/2)⏹通常包括以下步骤(以执行的先后顺序):⏹初始化本阶段要使用到的硬件设备。
⏹检测系统内存映射(memory map)。
⏹将kernel映像和根文件系统映像从flash上读到RAM空间中。
⏹为内核设置启动参数。
⏹调用内核。
⏹Bootloader的stage2确(2/2)⏹stage2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。
⏹与普通C语言应用程序不同的是,在编译和链接Bootloader这样的程序时,我们不能使用glibc库中的任何支持函数。
Linux 的Bootloader ⏹Bootloaer功能⏹系统配置、中断接管、引导⏹装载内核、根文件系统、参数传递、内核调试、内核和根文件系统的下载等等⏹常见的uClinux(Linux)的Bootloader:⏹Redboot⏹Blob⏹Vivi⏹Uboot⏹armBoot…U-boot命令⏹U-Boot的常用命令的用法⏹进入U-Boot控制界面后,可以运行各种命令,比如下载文件到内存,擦除、读写Flash,运行内存、NOR Flash、NAND Flash中的程序,查看、修改、比较内存中的数据等。
⏹使用各种命令时,可以使用其开头的若干个字母代替它。
比如tftpboot命令,可以使用t、tf、tft、tftp等字母代替,只要其他命令不以这些字母开头即可。
⏹当运行一个命令之后,如果它是可重复执行的(代码中使用U_BOOT_CMD定义这个命令时,第3个参数是1),若想再次运行可以直接输入回车。
U-Boot接收的数据都是十六进制,输入时可以省略前缀0x、0X。
⏹(1)帮助命令help⏹运行help命令可以看到U-Boot中所有命令的作用,如果要查看某个命令的使用方法,运行“help命令名”,比如“help bootm”。
可以使用“?”来代替“help”,比如直接输入“?”、“?bootm”。
⏹(2)下载命令⏹U-Boot支持串口下载、网络下载,相关命令有:loadb、loads、loadx、loady和tftpboot、nfs。
⏹前几个串口下载命令使用方法相似,以loadx命令为例,它的用法为“loadx[off][baud]”。
“[]”表示里面的参数可以省略,off表示文件下载后存放的内存地址,baud表示使用的波特率。
如果baud参数省略,则使用当前的波特率;如果off参数省略,存放的地址为配置文件中定义的宏CFG_LOAD_ADDR。
⏹tftpboot命令使用TFTP协议从服务器下载文件,服务器的IP地址为环境变量serverip。
用法为“tftpboot[loadAddress][bootfilename]”,loadAddress表示文件下载后存放的内存地址,bootfilename表示要下载的文件的名称。
如果loadAddress省略,存放的地址为配置文件中定义的宏CFG_LOAD_ADDR;如果bootfilename省略,则使用开发板的IP地址构造一个文件名,比如开发板IP为192.168.1.17,则默认的文件名为C0A80711.img。
⏹nfs命令使用NFS协议下载文件,用法为“nfs[loadAddress][hostip addr:bootfilename]”。
“loadAddress、bootfilename”的意义与tftpboot命令一样,“host ip addr”表示服务器的IP地址,默认为环境变量serverip。
下载文件成功后,U-Boot会自动创建或更新环境变量filesize,它表示下载的文件的长度,可以在后续命令中使用“$(filesize)”来引用它。