Beaglebone 中 U-Boot 的启动过程

简述:一般的嵌入式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文件来配置额外参数。

<think>好的,我现在需要回答用户关于“默认配置u-boot”的问题。首先,我需要回忆一下自己对U-Boot的了解。U-Boot是一个开源的引导加载程序,主要用于嵌入式系统。它负责初始化硬件设备,加载操作系统内核到内存,并执行它。用户问的是“默认配置u-boot”,可能是指U-Boot的默认配置是什么,或者如何配置默认的U-Boot设置。 接下来,我需要确定用户的具体需求。可能的情况有两种:用户想知道默认配置包含哪些内容,或者想知道如何生成或使用默认配置。为了全面回答,我应该涵盖这两个方面。 首先,默认配置通常指的是针对特定开发板或处理器的预定义配置文件。U-Boot的源码中通常包含多个这样的配置文件,位于configs目录下,文件名类似于<板名>_defconfig。例如,Raspberry Pi 3的配置文件是rpi_3_defconfig。这些配置文件定义了该硬件平台所需的编译选项,如处理器架构、外设驱动、启动参数等。 其次,用户可能需要了解如何应用这些默认配置。通常步骤是:进入U-Boot源码目录,执行make <板名>_defconfig命令,这会生成.config文件,之后进行编译。例如,make rpi_3_defconfig。之后执行make进行编译,生成u-boot.bin等文件。 另外,用户可能想知道默认配置的作用。默认配置简化了移植过程,开发者不需要从头开始配置所有选项,只需基于默认配置进行调整。这样可以节省时间,减少错误。 我还应该提到如何定制默认配置。比如使用make menuconfig命令来修改配置选项,或者直接编辑.config文件。但需要注意,直接编辑.config可能被后续的make命令覆盖,所以推荐使用defconfig文件进行永久性更改。 此外,可能涉及到的注意事项:不同版本的U-Boot可能有不同的配置选项,需要确认使用的版本是否匹配目标硬件;配置错误可能导致无法启动,所以测试时需谨慎;生成默认配置后可能需要根据具体硬件调整参数,如内存大小、串口设置等。 需要确保回答结构清晰,分点说明,使用中文,并且正确应用LaTeX格式。例如,在提到命令时,使用行内公式格式,如`make $<板名>\_defconfig$`,使用正确的转义符号。独立公式可能在这里不太需要,但如果有数学表达式,需用$$包围。 检查是否有遗漏点,比如是否需要解释U-Boot的基本功能,但用户可能已经了解,所以简要提及即可。重点放在默认配置的具体内容和使用方法上。此外,可能还需要提到如何查找支持的板级配置,比如查看configs目录下的文件列表,或者查阅官方文档。 最后,确保语言通俗易懂,避免过于技术化的术语,但作为引导加载程序的配置,适当的技术术语是必要的。需要保持回答准确且易于理解。</think>以下是关于U-Boot默认配置的详细介绍,分步骤说明其核心概念和操作流程: --- ### 1. **U-Boot默认配置的定义** U-Boot的默认配置(Default Configuration)是针对**特定硬件平台**预定义的编译选项集合,通常以`<板名>_defconfig`命名,保存在源码的`configs/`目录下。例如: - Raspberry Pi 3的配置文件:`rpi_3_defconfig` - BeagleBone Black的配置文件:`am335x_boneblack_defconfig` 这些文件定义了: - **处理器架构**(如ARM、RISC-V) - **外设驱动**(如网卡、存储控制器) - **启动参数**(如内核加载地址、环境变量) --- ### 2. **默认配置的作用** - **快速移植**:开发者无需手动配置所有选项,直接基于默认配置适配硬件。 - **标准化支持**:官方为常见开发板维护了已验证的配置,确保稳定性。 - **编译基础**:通过默认配置生成`.config`文件,作为编译的输入。 --- ### 3. **如何使用默认配置** #### 步骤1:获取U-Boot源码 ```bash git clone https://github.com/u-boot/u-boot.git cd u-boot ``` #### 步骤2:应用默认配置 执行命令(以树莓派3为例): ```bash make rpi_3_defconfig ``` 此命令会: 1. 读取`configs/rpi_3_defconfig`文件。 2. 生成`.config`文件,包含所有编译选项。 #### 步骤3:编译U-Boot ```bash make -j$(nproc) ``` 生成关键文件:`u-boot.bin`(二进制镜像)。 --- ### 4. **自定义配置** 若需修改默认配置: - **交互式配置**:运行`make menuconfig`,通过图形界面调整选项。 - **直接编辑**:修改`.config`文件(注意:此方式可能被覆盖)。 - **保存配置**:将修改后的配置导出为新文件: ```bash make savedefconfig cp defconfig configs/my_custom_defconfig ``` --- ### 5. **关键配置选项解析** | 配置项 | 作用示例 | 典型值 | |-----------------------|-----------------------------------|---------------------------| | `CONFIG_ARM=y` | 指定处理器架构为ARM | `y`(启用) | | `CONFIG_SYS_BAUDRATE` | 设置串口调试波特率 | `115200` | | `CONFIG_BOOTCOMMAND` | 定义自动启动命令 | `"load mmc 0:1 ..."` | | `CONFIG_CMD_NET` | 启用网络功能 | `y` | --- ### 6. **注意事项** - **版本匹配**:确保U-Boot版本与硬件兼容(如新功能可能导致旧板不兼容)。 - **环境变量**:默认配置可能包含预定义的`bootargs`,需根据实际内核调整。 - **依赖项**:编译前需安装交叉编译工具链(如`gcc-arm-linux-gnueabihf`)。 --- ### 7. **调试与验证** - **QEMU模拟**:部分配置支持通过QEMU测试,如: ```bash qemu-system-arm -M virt -kernel u-boot.bin ``` - **串口输出**:连接硬件串口,观察U-Boot启动日志,确认驱动初始化是否正常。 --- 通过以上步骤,您可以理解并操作U-Boot的默认配置,为嵌入式系统开发提供可靠的引导基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值