bootloader分析
- 格式:pdf
- 大小:205.19 KB
- 文档页数:31
【精编推荐】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启动过程分析一、 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启动代码分析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代码分析报告文档从互联网中收集,已重新修正排版,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.程序跳转宏定义............................................................... 错误!未定义书签。
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段。
实验十二 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文件系统的实现。
ARM裸板编程——bootloader代码分析简介bootloader从字面上理解就是“引导装载”的含义,它是在系统通电后就开始运行,它的任务主要是对硬件进行初始化,并以启动操作系统内核为终极目标的一段程序。
将操作系统内核启动完后,系统控制权就交予内核,bootloader的工作就结束了。
bootloader种类很多,我们之后学的u-boot,全称universal bootloader,即通用的bootloader,它遵循GPL条款的开放源代码项目。
这里的“通用”表示一、可以引导多种操作系统二、支持多种架构的CPU通用概念bootloader的实现是非常依赖于硬件的,如果硬件不同,bootloader的设置就不同。
有些CPU在运行bootloader前需要运行一段固化的程序(也称为固件)它的作用基本上是用来引导bootloader的,例如x86结构的CPU,就是先运行BIOS中的固件,然后才运行硬盘第一个分区中的bootloader。
在大多数嵌入式系统中并没有这些固件,bootloader是通电后执行的第一个程序。
bootloader的终极目标是启动操作系统内核的,bootloader将需要传给内核的参数固定放在一个地方,在内核启动之后由内核从那里取出这些参数进行使用。
LCD,基本上开发板相关的函数再次之前我们可以把源码包中和mini6410无关的文件删除以减少我们的阅读量,一般删除无关u-boot启动内核的过程因为u-boot的终极目标是启动内核,在启动内核之前u-boot会去对需要使用到的①硬件进行初始化,比如:时钟、串口、DDR、Flash等等。
内核一般我们都是通过USB线烧写到Nand Flash 中,u-boot还需要将内核②从Flash中复制③到DDR中,然后④传递参数并⑤启动内核。
为了方便使用还可以在u-boot中加入用户想要的功能,比如说:写Flash(u-boot、内核等)、USB相关功能、u-boot命令行等就将u-boot当做是一个比较复杂的裸板程序。
今天我们讨论一下PXA255芯片的bootloader的初始化过程,也就是start_xscale。
S的汇编文件中包含的内容。
E1开发板的硬件配置是这样的,400M Turbo模式运行的PXA255处理器,32M Flash和64M SDRAM。
start_xscale。
S包含的主要内容是系统上电后的初始化过程,依次为:屏蔽硬件中断、初始化GPIO引脚、初始化Flash和SDRAM、拷贝bootloader代码到SDRAM中、拷贝内核代码到SDRAM中、最后跳转到bootloader的main程序中去执行。
关于PXA255芯片的详细信息请参阅《PXA255 Developer’s Manual》.1 屏蔽硬件中断ldr r12, =INTERRUPT_CONTROL_BASEldr r0,=0x00000000str r0,[r12,#ICMR]str r0,[r12, #ICLR]这一部分的代码很简单,即使将中断屏蔽寄存器ICMR置0,屏蔽所有硬件中断。
2 初始化GPIO引脚gpio_init:ldr r12, =GPIO_BASEldr r0, =GAFR0L_V ALUEstr r0, [r12, #GAFR0_L]ldr r0, =GAFR0U_V ALUEstr r0, [r12,#GAFR0_U]ldr r0,=GAFR1L_VALUEstr r0, [r12, #GAFR1_L]ldr r0,=GAFR1U_V ALUEstr r0,[r12,#GAFR1_U]ldr r0, =GAFR2L_V ALUEstr r0, [r12, #GAFR2_L]ldr r0, =GAFR2U_V ALUEstr r0, [r12, #GAFR2_U]ldr r0, =GPSR0_V ALUEstr r0, [r12, #GPSR0]ldr r0,=GPSR1_V ALUEstr r0, [r12, #GPSR1]ldr r0, =GPSR2_V ALUEstr r0,[r12,#GPSR2]ldr r0,=GPCR0_V ALUEstr r0,[r12, #GPCR0]ldr r0,=GPCR1_V ALUEstr r0,[r12,#GPCR1]ldr r0, =GPCR2_V ALUEstr r0, [r12, #GPCR2]ldr r0,=GPDR0_V ALUEstr r0,[r12,#GPDR0]ldr r0, =GPDR1_V ALUEstr r0, [r12,#GPDR1]ldr r0,=GPDR2_V ALUEstr r0, [r12,#GPDR2]// Clear the peripheral control register bits,so that we can use gpio as configured aboveldr r1,=PSSRldr r2, =(PSSR_RDH | PSSR_PH)str r2, [r1]mov pc, lr这里我们着重讨论关于GPIO的功能寄存器的设置,也就是GAFR寄存器,有几个问题要注意:1 静态存储器空间nCS0的片选信号没有与GPIO脚复用,,这是因为由于芯片当复位时自动跳转到地址0运行,因此对这一块地址需要专用的片选信号。
一.BootLoader简介在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:1、引导加载程序。
包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、Linux内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
3、文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ramdisk来作为rootfs。
4、用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:MicroWindows和MiniGUI懂。
引导加载程序是系统加电后运行的第一段软件代码。
PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。
BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
bootloader通俗解释摘要:1.Bootloader的概念与作用2.Bootloader的种类与区别3.Bootloader的应用场景4.如何选择合适的Bootloader5.Bootloader的编写与定制6.Bootloader的安全性与优化7.总结与展望正文:一、Bootloader的概念与作用Bootloader,简称“boot loader”,中文意为“引导加载程序”,是计算机启动时加载操作系统之前执行的一段程序。
它的主要作用是在计算机加电后,将操作系统加载到内存中并启动操作系统。
二、Bootloader的种类与区别根据硬件平台和操作系统的不同,Bootloader有多种类型。
常见的有:1.BIOS Bootloader:适用于基于BIOS(Basic Input/Output System)的计算机,如传统的x86架构。
2.UEFI Bootloader:适用于基于UEFI(Unified Extensible Firmware Interface)的计算机,如现代的x86_64架构。
3.Linux Bootloader:主要用于加载Linux操作系统,如GRUB(GrandUnified Bootloader)。
4.Windows Bootloader:用于加载Windows操作系统,如NTLDR (Windows NT Loader)。
三、Bootloader的应用场景1.操作系统多重启动:允许用户在启动时选择不同的操作系统,如Windows和Linux。
2.操作系统修复:当操作系统无法正常启动时,通过Bootloader进入恢复模式,进行修复。
3.数据恢复:利用Bootloader启动特定的数据恢复工具,进行数据救援。
4.硬件测试:利用Bootloader启动硬件测试工具,如硬盘检测工具、内存检测工具等。
四、如何选择合适的Bootloader1.了解计算机硬件平台和操作系统:根据计算机使用的硬件架构和操作系统,选择相应的Bootloader。
BOOTLOADER启动程序分析——基于工程D003_Malata35P_63509_chinese桂洁2007.12.3 .eboot.nb0是第一次被JTAG烧到NOR。
以后,bootloader负责对:xip.bin:先写到RAM,再烧到nand flash;nk.bin:直接写到RAM;eboot.bin:由eboot.nb0下载,先写到RAM,再烧到nor flash。
上电后:eboot本身会将自己写到RAM。
也会把nand中的镜像写到RAM中再执行。
程序一上电,自动执行0x00000000处的指令。
所以,只要把这条指令设定好,下面就可以按我们自己的思想进行设计。
一.f wxsc1.s位于:D:\WINCE420\PLA TFORM\SEUICBSP\KERNEL\HAL\ARM这是startup。
他是一个汇编程序。
1.入口为:LEAF_ENTRY StartUp,第一条语句是:B Reset_Handler,放在0x00000000处。
所以上电后首先执行这条指令。
2.Reset_Handler,是StartUp的主体。
根据复位类型进行硬件的初始化。
具体步骤为(可能不是很准确):串口初始化,CPU进入特殊指令模式,关MMU,关中断,检查复位原因,初始化硬件(GPIO,内存,中断控制器,时钟,PowerManager),通过串口打印信息,查SDRAM,bootloader将自己写到RAM,检查正确性,跳到RAM,设置并使能MMU,Cache,设堆。
3.最后一条语句是bl main。
跳到main函数。
二main1.main位置:D:\WINCE420\PLA TFORM\SEUICBSP\EBOOT\main.c。
作用:调用BootloaderMain()。
2.BootloaderMain位置:D:\WINCE420\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON\blco mmon.c作用:这是bootloader的框架。
Bootloader代码分析代码分析报告(一)Bootloader代码分析1.第一部分功能:关闭中断,进入ARM状态,切换到SVC模式(复位异常进入SVC 模式)。
MRS r0, cpsr把状态寄存器CPSR中数据读入r0 寄存器。
BIC r0, r0, #MASK_MODE(MASK_MODE = 0x0000003F)把 r0 寄存器的低6位清零。
(把Thumb状态为清零,回到ARM状态)ORR r0, r0, #MODE_SVC32(MODE_SVC32 = 0x00000013)把r0 寄存器的低5置为 10011(SVC模式)。
ORR r0, r0, #I_BIT(I_BIT = 0x80)把r0 寄存器的第8位置1(关闭中断状态位)。
ORR r0, r0, F_BIT(F_BIT = 0x40 )把r0 寄存器的第7位置1(关闭快速中断状态位)。
MSR cpsr_c, r0把r0 寄存器的低8位存储进CPSR寄存器的低8位。
自此进入ARM状态,切换到SVC模式,关闭中断和快速中断。
LDR r2, = ARM7_INTMASKASIC_BASE EQU 0x03ff0000ARM7_INTMASK EQU (ASIC_BASE+0x4008)ARM7_INTMASK = 0x03ff4008把0x03ff4008存入r2 寄存器。
ASIC_BASE 是SYSCFG寄存器的第16位到第25位,是指S3C4510b中特殊寄存器的启始地址。
SYSCFG寄存器复位时缺省值是0x37ff ff91。
SYSCFG寄存器的第16位到第25位的值是0x 3ff。
ARM7_INTMASK EQU (ASIC_BASE+0x4008)中断模式寄存器:控制中断源的掩码。
偏移地址0x4008。
ARM7_INTMASK 就是中断模式寄存器的寻址地址。
ARM7_INTMASK = 0x03ff4008第21位是全局模式位:置1时断开所有中断源。
第七章BootLoader实例剖析7.1 BootLoader概述BootLoader:引导加载程序,就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
BootLoader包括固化在固件(firmware)中的boot 代码(可选)和外部的BootLoader 两大部分。
大多数BootLoader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。
但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。
也即Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
这种模式是Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。
从主机下载的文件通常首先被BootLoader 保存到目标机的RAM 中,然后再被Boot Loader 写到目标机上的FLASH 类固态存储设备中。
BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。
工作于这种模式下的Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。
7.2 ARM7教学平台BIOS剖析7.2.1 简介ARM7教学平台BIOS就是FS44B0Xbios--BIOS FOR FS44B0X,是优龙公司专门为FS44B0X开发板提供的。
第七章BootLoader实例剖析7.1 BootLoader概述BootLoader:引导加载程序,就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
BootLoader包括固化在固件(firmware)中的boot 代码(可选)和外部的BootLoader 两大部分。
大多数BootLoader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。
但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。
也即Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。
这种模式是Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的BootLoader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。
从主机下载的文件通常首先被BootLoader 保存到目标机的RAM 中,然后再被Boot Loader 写到目标机上的FLASH 类固态存储设备中。
BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。
工作于这种模式下的Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。
7.2 ARM7教学平台BIOS剖析7.2.1 简介ARM7教学平台BIOS就是FS44B0Xbios--BIOS FOR FS44B0X,是优龙公司专门为FS44B0X开发板提供的。
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)”来引用它。