欢迎关注公众号,文章会同步发布在嵌入式客栈
引言:本文简明扼要的介绍了嵌入式Linux的引导过程,X86体系的引导过程以及几种常见嵌入式处理器的引导过程,U-Boot的移植的基本步骤、常用命令如何使用。通过本文可以对嵌入式Linux的引导从概念到实际操作有一个总体清晰的认识
1.启动顺序
1.1 Bootloader
Bootloader(引导加载程序)本质上是一小段程序,其基本功能在于:
基本的硬件初始化
从闪存存储,网络或其他类型的非易失性存储中加载应用程序二进制文件(通常是操作系统内核)。
可能会对应用程序二进制文件进行解压缩
执行申请1.2 基于BIOS-X86的引导
x86处理器通常安装在在一块包含BIOS程序的非易失性存储器主板上。 在基于BIOS的旧x86平台上:BIOS负责基本的硬件初始化和从非易失性存储中加载一小段代码。 这段代码通常是第一阶段的引导程序bootloader,它将加载完整的引导程序bootloader本身。 bootloader可以解析文件系统,因此内核映象可以直接从普通文件系统中加载。 此顺序与现代基于EFI的系统不同。1.3 嵌入式CPU的引导
Case 1:CPU内部无引导代码
Case2:CPU内具有引导代码
CPU在ROM中具有集成的引导代码。如:AT91 CPU上的BootROM,OMAP上的“ ROM代码”,等等。具体细节取决于CPU体系结构 此引导代码能够将第一级引导加载程序从存储设备加载到内部SRAM(因为DRAM尚未初始化)。 存储设备通常可以是:MMC,NAND,SPI闪存,UART(通过串行线传输数据)等等。 第一阶段的引导程序: 由于硬件限制,尺寸有限(SRAM比较贵), 由CPU供应商或社区项目提供 此第一阶段引导程序必须初始化DRAM和其他硬件设备,并将第二阶段的引导程序加载到RAM1.2.1 ARM Microchip AT91的引导
1.2.2 ARM TI OMAP2+/AM33xx的引导
ROM代码:尝试从各种方法中找到有效的引导映像存储源,并将其加载到SRAM或RAM中(RAM可以是由ROM代码通过配置标头初始化)。尺寸限制为<64 KB。没有用户互动的可能。 X-Loader或U-Boot SPL:从SRAM运行。初始化DRAM,NAND或MMC控制器,并加载辅助将引导程序加载到RAM中并启动它。没有用户互动的可能。文件名为MLO。 U-Boot:从RAM运行。初始化其他一些硬件设备(网络,USB等)。从存储或加载内核映像网络到RAM并启动它。具有提供的命令的Shell。该文件一般名为u-boot.bin或u-boot.img。 Linux内核:从RAM运行。完全接管系统(引导程序不再存在)。1.2.3 MarvellSoCs 的引导
1.2.4 常见嵌入式处理器的bootloader
本文将重点介绍通用部分,即主要的引导加载程序重要功能。有几种开源的通用引导加载程序。以下是最受欢迎的:
U-Boot,Denx的通用引导程序。最常用于ARM,也可用于PPC,MIPS,x86,m68k,NIOS等。
如今已成为事实上的标准。我们将详细研究它。
http://www.denx.de/wiki/U-Boot
Barebox,与体系结构无关的引导程序,是U-Boot的后继产品。它尚不具备U-Boot的硬件支持。U-Boot改善了非常感谢这位竞争对手。
http://www.barebox.org
还有很多其他开源或专有的引导程序,通常特定于架构。如RedBoot,Yaboot,PMON等
U-Boot
2.1 介绍
U-Boot是一个典型的免费软件项目
许可证:GPLv2(与Linux相同)
可从http://www.denx.de/wiki/U-Boot免费获得
可从http://www.denx.de/wiki/U-Boot/Documentation获得文档
Git存储库中提供了最新的开发源代码:
http://git.denx.de/?p=u-boot.git;a=摘要
围绕开放的邮件列表进行开发和讨论,http://lists.denx.de/pipermail/u-boot/自2008年底开始,它遵循固定间隔的发布时间表。两个几个月,发布了新版本。版本名为YYYY.MM。
2.2 配置文件
从网站获取源代码并解压缩。configs/目录为每个受支持的板包含一个配置文件,定义CPU类型,外围设备及其配置,存储器映射,应在其中编译的U-Boot功能等。
注意:U-Boot正在从头文件中定义的主板配置迁移(include/configs/)改为defconfig,就像在Linux内核(configs/)中一样
并非所有电路板都已转换为新的配置系统。硬件供应商提供的较旧的U-Boot版本可能尚未使用此新版本配置系统。
U-BOOT 配置文件CHIP_defconfig举例如下:
CONFIG_ARM=y
CONFIG_ARCH_SUNXI=y
CONFIG_MACH_SUN5I=y
CONFIG_DRAM_TIMINGS_DDR3_800E_1066G_1333J=y
CONFIG_USB0_VBUS_PIN=“PB10”
CONFIG_VIDEO_COMPOSITE=y
CONFIG_DEFAULT_DEVICE_TREE=“sun5i-r8-chip”
CONFIG_SPL=y
CONFIG_SYS_EXTRA_OPTIONS=“CONS_INDEX=2”
CONFIG_CMD_DFU=y
CONFIG_CMD_USB_MASS_STORAGE=y
CONFIG_AXP_ALDO3_VOLT=3300
CONFIG_AXP_ALDO4_VOLT=3300
CONFIG_USB_MUSB_GADGET=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_DOWNLOAD=y
CONFIG_G_DNL_MANUFACTURER=“Allwinner Technology”
CONFIG_G_DNL_VENDOR_NUM=0x1f3a
CONFIG_G_DNL_PRODUCT_NUM=0x1010
CONFIG_USB_EHCI_HCD=y
2.3 配置并编译
必须先配置U-Boot,然后再进行编译2.4 安装U-Boot
通常必须将U-Boot安装在闪存中才能由硬件执行。取决于硬件,U-Boot的安装以不同的方式完成:
2.5 U-boot启动提示信息
通过串行控制台将目标连接到主机。接通电路板电源。在串行控制台上,您将看到类似以下内容:
U-Boot Shell提供了一组命令。本文将研究最重要的内容,请参阅文档以获取完整参考或help命令。
2.5.1 基本信息命令
Flash information (NOR and SPI fl ash)
NAND flash information
Version details
2.5.2 重要命令
具体的命令集取决于U-Boot配置
2.5.3 环境变量
U-Boot可以通过环境变量进行配置举例:
重要的U-Boot环境变量:
举例:
setenv mmc-boot ‘if fatload mmc 0 80000000boot.ini; then source; else
if fatload mmc 0 80000000 zImage; then runmmc-do-boot; fi; fi’
2.5.4 传送文件到目标板
U-Boot主要用于加载和引导内核映像,但是它也允许更改内核映像和存储在闪存中的根文件系统。必须在目标和开发工作站之间交换文件。
可能的方法:
通过TFTP:
将文件通过TFTP网络从开发工作站(Host)传输到目标机(Target)上的U-Boot。是一种普通文件传输协议,类似于FTP,但是没有身份验证并且采用UDP传输层协议 开发工作站上需要配置TFTP服务器,可参照下列步骤进行配置 sudo apt install tftpd-hpa 所有位于开发工作站上/var/lib/tftpboot中的文件对于TFTP tftp-hpa软件包中提供了TFTP客户端,可用于测试TFTP服务器是否搭建成功 TFTP客户端已集成到U-Boot中,通过以下步骤进行配置测试
1.配置ipaddr以及serverip环境变量
2.使用tftp