且允许用户在这两种工作模式之间进行切换。比如,Blob 在启动时处于正常的启动加载模
式,但是它会延时 10 秒等待终端用户按下任意键而将 blob 切换到下载模式。如果在 10
秒内没有用户按键,则 blob 继续启动 Linux 内核。
三、Boot Loader 与主机之间进行文件传输协议
最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传
输协议通常是 xmodem/ymodem/zmodem 协议中的一种。但是,串口传输的速度是有
限的,因此通过以太网连接并借助 TFTP 协议来下载文件是个更好的选择。
此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和
TFTP 协议来下载文件时,主机方必须有一个软件用来的提供 TFTP 服务。
四、Bootloader 的工作流程
由于 Boot Loader 的实现依赖与 CPU 的体系结构,因此大多数的 Boot Loader 都分为
stage1 和 stage2 两个阶段:
1,Bootloader 的第一阶段(Stage1),工作流程
硬件设备初始化
代码重定位,为加载 Boot Loader 的 stage2 准备 RAM 空间
加载 t 第二阶段代码到 RAM 空间
设置堆栈跳转到第二阶段代码入口
1.1,硬件设备初始化通常包括如下步骤:(按先后顺序执行):
【1】复位(reset)
【2】设置 CPU 为超级保护模式(SVC) 即特权模式(Supervisor)
【3】关闭看门狗,不必附加喂狗代码。
【4】屏蔽所有中断,为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot
Loader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写 CPU 的中断屏蔽寄
存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完成。
【5】设置系统时钟频率。
【6】初始化内存控制器,包括正确地设置系统的内存控制器的功能寄存器以及各内
存库控制寄存器等。
【7】初始化串口等,典型地,初始化 UART 并向串口打印相关字符信息。
【8】初始化 LED。典型地,通过 GPIO 来驱动 LED,其目的是表明系统的状态是 OK
还是 Error。如果板子上没有 LED,那么也可以通过初始化 UART 向串口打印 Boot
Loader 的 Logo 字符信息来完成这一点。
【9】关闭 CPU 内部指令/数据 cache。
1.2,代码重定位主要检查自己是否在内存中。如果是跳到堆栈段(stack_setup 代码
段)设置堆栈,不是就加载自己到 RAM 空间。
为了获得更快的执行速度,通常把 stage2 加载到 RAM 空间中来执行,因此必须为加