bootloader

1.基本概念

  • bootloader是硬件启动的引导程序,是运行操作系统的前提
  • 在操作系统内核或用户应用程序运行之前运行的一小段代码.其对软硬件进行相应的初始化和设定,为最终运行操作系统准备环境
  • 在嵌入式系统中,整个系统的启动加载任务通常由bootloader完成

2.bootloader操作模式

  • 自启动模式:在此模式下,bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,全过程没有用户介入
  • 交互模式:在此模式下,目标机上的bootloader将通过串口或网络等通信手段从开发机上下载内核镜像和根文件系统到RAM中.可被bootloader写到目标机上的固态存储介质中,或者直接进行系统引导.也可通过串口接收用户命令

3.u-boot命令

1.简单配置环境命令

  • help帮助查看其他命令的使用方法
  • printenv作用是打印出系统中所有的环境变量,printenv命令可以简化为pri
  • setenv设置(添加/更改)环境变量,可简化为set

1.set var value新建一个环境变量
2.set var value更改一个环境变量
3.set var删除一个环境变量

  • saveenv将内存中的环境变量的值同步保存到Flash中环境变量的分区,可简化为save

2.网络相关

  • ping测试开发板和主机之间的网络链接
  • tftp从服务器下载内容到客户端

tftp 0x30000000 zImage-qt:将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址处

  • nfs同步文件夹

3.flash相关

  • protect对Nor Flash写保护

protect on 0 10000对区间[0x0,0x100000]写保护
protect off 0 10000对区间[0x0,0x100000]取消写保护

  • erase擦除Nor Flash

erase all擦除flash所有扇区
erase 0 10000擦除区间[0x0,0x100000]

  • Nand Flash按块访问,Nor Flash按字节访问,后者先擦后写
  • nand read/write addr off size读写多少字节
  • movi是一个命令集,有很多子命令,具体用法可以help movi查看

movi read u-boot 0x30000000意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处

4.启动内核命令

  • bootcmd自启动命令,如果定义了该变量,在自启动模式下将会执行该环境变量中的命令
  • bootmbootm启动内核同时给内核传参,bootm专门用于启动内核的
  • 一般会在bootcmd环境变量中指定bootm命令,让系统自动加载运行内核,文件系统等
  • gogo命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已,一般运行裸机程序

4.编译u-boot

  • 编译最终生成.bin二进制烧录文件
  • 生成的.map文件为u-boot镜像的符号表,方便源码跟踪

5.u-boot目录结构

1.平台相关:arch,board,include...
2.平台无关:common,net,fs,drivers...
3.工具与文档:tools,doc

6.u-boot启动流程

1.u-boot第一条指令:

  • u-boot代码存放于flash等掉电不丢失的存储介质中,而非内存里面
  • 故第一条指令存放于flash里面

2.初始化硬件种类及其先后顺序:

  • 最开始初始化时钟
  • 之后为内存,串口,flash等初始化
  • 为保证初始化成功,在初始化的时候需关闭看门狗,中断,MMU,cache等

3.内核如何加载

  • 内核(操作系统)一般也放在flash里面

4.性能提升

  • 为提高开机速度,将存储与运行分开,在启动时候先将u-boot和内核先加载到内存里面运行,大大提升运行速度

5.u-boot使用大约10%的汇编与90%左右的C语言组成

  • 在汇编阶段初始化基本硬件,关闭中断等
  • 之后设置栈,随后执行C程序,搬移内核到内存,最后运行内核

6.总体流程

  • 上电关闭中断,看门狗,cache,mmu等
  • 初始化时钟,串口,内存,flash,nand,dram等
  • 开始自搬移,即u-boot将自己搬移到内存中执行
  • 调用C程序,初始化大部分硬件
  • 判断启动是否被按键打断,未被打断则执行boodcmd指令完成自启动,引导内核启动;被打断则执行boot指令

7.部分源码分析

1.初始汇编代码

  • 通过链接文件u-boot.lds知道初始汇编代码位于cpu/arm_cortexa9/start.o下面,打开文件部分代码如下
  • 最开始是中断向量表
        .word 0x2000
        .word 0x0
        .word 0x0
        .word 0x0
.globl _start
_start: b       reset        /*此处为硬件上电执行的第一条指令*/
        ldr     pc, _undefined_instruction
        ldr     pc, _software_interrupt
        ldr     pc, _prefetch_abort
        ldr     pc, _data_abort
        ldr     pc, _not_used
        ldr     pc, _irq
        ldr     pc, _fiq
  • reset部分代码
/*
 * the actual reset code
 */

reset:
#if 0
        /*
         * set the cpu to SVC32 mode and IRQ & FIQ disable
         */
        mrs     r0, cpsr
        bic     r0, r0, #0x3f
        orr     r0, r0, #0xd3
        msr     cpsr, r0
#else//*****ly
        mrs     r0, cpsr
        bic     r0, r0, #0x1f
        orr     r0, r0, #0xd3
        msr     cpsr,r0
#endif

1.通过配置cpsr寄存器将cpu工作模式设置为super模式

你可能感兴趣的:(bootloader)