简述:一般的嵌入式linux系统从SD卡或eMMC启动的过程都是上电时从硬件固化的ROM中读取数据,引导加载MLORAM中运行,进一步将uboot.img引导加载到DDR中运行。之后由uboot来引导内核镜像、设备树以及驱动模块,最后内核来引导加载根文件系统,完成整个系统的加载。

为了方便的调试系统,也有从串口获取MLOu-boot.img文件,随后uboot启动完成终端输入命令,通过TFTP协议获取内核镜像以及设备树驱动等文件,最后使用NFS网络文件系统的共享目录挂载根文件系统。

所以本文先介绍uboot引导启动的过程,其他博客介绍制作最新的BBB启动SD卡和远程挂载系统。

 

  • BBB的启动顺序区别于boot键是否按下,按照现在网上最流行的说法,

boot键未按下时启动顺序:eMMCSDUART0USB0

boot键按下时启动顺序是:SPI0SDUSB0UART0.

 

   AM335X的启动流程:ROM->MLO(SPL)->uboot.img

ROM阶段:引导加载程序,板子上电后自动执行这些固化在板子中的代码,存放在176KBROM中,完成如选择哪种启动方式(NAND,SDcard,UART…)等功能,然后跳转到SPL阶段。

ROM Code主要功能如下:

1)配置设备并初始化主要的外设

2)建立堆栈

3)配置开门狗定时器1(设置到三分钟)

4)配置 PLL 和系统时钟

5)为下一阶段启动做准备

6)为下一阶段启动检查启动源(SPL

(7)把下一启动阶段的 bootloader 代码(MLO)移动到内存中准备运行

 

MLO(SPL)阶段:SPL过程读取MLO文件,MLO文件会被映射到64KInternal SRAM中,其实MLO文件是一个精简版的u-boot,U-Boot生成,但功能有限,用以硬件初始化,关闭看门狗,关闭中断,设置CPU时钟频率、速度等操作。然后跳转到uboot阶段, SPL 是启动 U-Boot 前的一个阶段,并且必须从启动源(MMCUSBSDUART等)加载到内部 RAM 中。SPL 只有极少的功能,SPL 主要的职责就是初始化 DDR,时钟等最小系统,以读取 u-boot.img 并加载到 DDR 中。

 

u-boot阶段:启动uboot,可配置选择引导的内核、设备树、驱动,设置NFS网络文件系统启动等操作,u-boot引导阶段,通过uEnv.txtboot.src文件配置额外参数,uEnv.txt可以编辑,一般通过该文件指定内核等。当然在uboot刚加载时按下键盘空格键可以中断引导,切换至用户交互终端模式进行配置。u-boot启动的第一个阶段会初始化一些普通外设,所以是可以使用键盘的。

注:ROM code是板子固化的,MLOu-boot.img是编译uboot时生成的,可以拷贝或者串口传输到开发板上,本文之后介绍适合BBB开发板的uboot制作过程。

 

采用三个阶段启动系统的原因:

一个全功能的U-Boot可能会超过400KB,因此不可能直接将它加载进内部RAM中直接运行,因此要分阶段。首先,第一步的 ROM Code (固化代码)不可能太复杂,ROM大小是一个限制,最重要的还是因为其所能获取的系统信息太少,所以处理器只能使用简单的方法去寻找能完成复杂功能的代码,而后将处理器初始化工作交给它来完成。其次,SPL MLO)也不能很复杂,因为 ROM Code 只能将它加载到处理器内部 RAM 中运行,一般处理器的内部 RAM 都要小于128KB,其大小注定其不能完成很复杂的功能,所以 SPL 需要初始化 DDR 再加更复杂的代码加载到 DDR 中运行。到了在 DDR RAM 中执行的 BootloaderU-Boot),其功能就比较完善了,此时就可以启动操作系统了。

 

uboot引导参数配置:

boot.scr: This file is a U-Boot script. It contains instructions for U-Boot. Using these instruction, the kernel is loaded into memory, and (optionally) a ramdisk is loaded. boot.scr can also pass parameters to the kernel. This file is a compiled script, and cannot be edited directly. In some cases, boot.scr loads further instructions and configuration parameters from a text file.

uEnv.txt: A file with additional boot parameters. This file can be read by boot.scr, or by the boot sequence if there is no script file. uEnv.txt is a regular text file that can be edited. This file should have Unix line ending, so a compatible program must be used when editing this file.

U-Boot 启动的时候如果不打断会调用 bootcmd 包含的命令来执行,通常 bootcmd 会调用 bootscript 脚本也就是 boot.scr里面的命令进行执行, boot.scr 通常也会先读取 uEnv.txt 确定额外参数,因为 boot.src 文件必须通过 boot.cmd 文件编译而来, uEnv.txt 则是可以任意编辑,这样可配置性就大大提高了。如果没有 boot.src 文件,U-Boot 有默认配置的 bootcmd 命令。

结论:配置BeagleBoneUboot只需修改uEnv.txt文件来配置额外参数。