嵌入式Linux引导以及U-Boot移植深度分析

引言:本文简明扼要的介绍了嵌入式     Linux   的引导过程,X86体系的引导过程以及几种常见     嵌入式处理器   的引导过程,U-Boot的移植的基本步骤、常用命令如何使用。通过本文可以对嵌入式Linux的引导从概念到实际操作有一个总体清晰的认识

1.启动顺序

1.1 Bootloader

Bootloader(引导加载程序)本质上是一小段程序,其基本功能在于:

基本的硬件初始化

从闪存存储,网络或其他类型的非易失性存储中加载应用程序二进制文件(通常是操作系统内核)。

可能会对应用程序二进制文件进行解压缩

执行申请

除此基本功能之外,大多数Bootloader(引导加载程序)实现了Shell命令集以执行不同操作。

从存储或网络中加载数据,内存检查,硬件诊断和     测试  

1.2 基于B     IOS   -X86的引导

x86处理器通常安装在在一块包含BIOS程序的非易失性     存储器   主板上。

在基于BIOS的旧x86平台上:BIOS负责基本的硬件初始化和从非易失性存储中加载一小段代码。

这段代码通常是第一阶段的引导程序bootloader,它将加载完整的引导程序bootloader本身。

bootloader可以解析文件系统,因此内核映象可以直接从普通文件系统中加载。

此顺序与现代基于EFI的系统不同。

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

用于X86体系Linux的bootloader常用的有以下两种:

GNU GRUB(GRand Un     if   iedBootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在     计算机   内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

在X86架构的机器中,Linux、BSD 或其它Unix类的操作系统中GRUB、LILO 是大家最为常用,应该说是主流。

详细信息请参考:http://www.gnu.org/software/grub/

syslinux是一个功能强大的引导加载程序,而且兼容各种介质。它的目的是简化首次安装Linux的时间,并建立修护或其它特殊用途的启动盘。它的安装很简单,一旦安装syslinux好之后,sysLinux启动盘就可以引导各种基于DOS的工具,以及MS-DOS/Windows或者任何其它操作系统。不仅支持采用BIOS结构的主板,而且从6.0版也开始支持采用EFI结构的新型主板。

Syslinux常被用于自网络或者可移动存储介质(如     USB   /CD-     ROM   )引导 Linux

详细信息请参考:https://kernel.org/pub/linux/u     ti   ls/boot/syslinux/

1.3 嵌入式     CPU   的引导

Case 1:CPU内部无引导代码

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

CPU上电后,CPU开始在固定地址入口执行代码

CPU没有提供其他引导机制

硬件设计必须确保已连接存储芯片(如NOR闪存芯片)这样就可以在CPU启动的地址访问它并执行指令

第一级引导程序必须在此地址编程在该存储芯片中(如NOR)

NOR是强制性的,因为它允许随机访问,NAND不允许

注:这种方案已不常用,因为需要NOR FLASH

Case2:CPU内具有引导代码

CPU在ROM中具有集成的引导代码。如:AT91 CPU上的BootROM,OMAP上的“ ROM代码”,等等。具体细节取决于CPU体系结构

此引导代码能够将第一级引导加载程序从存储设备加载到内部S     RAM   (因为     DRAM   尚未初始化)。 存储设备通常可以是:MMC,NAND,S     PI   闪存,     UART   (通过串行线传输数据)等等。

第一阶段的引导程序: 由于硬件限制,尺寸有限(SRAM比较贵), 由CPU供应商或社区项目提供

此第一阶段引导程序必须初始化DRAM和其他硬件设备,并将第二阶段的引导程序加载到RAM

因为本文专注嵌入式领域,故接下来将描述几种常见的嵌入式处理器的引导过程。

1.2.1     ARM       Microchip   AT91的引导

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

RomBoot:尝试从各种设备中找到有效的引导映像存储源,然后将其加载到SRAM中(DRAM还未初始化)。大小限制为4 KB,无法进行用户互动标准启动模式。

AT91Bootstrap:从SRAM运行。初始化DRAM,NAND或SPI控制器,并将辅助引导程序加载到RAM并启动它,此阶段没有用户互动的可能。

U-Boot:从RAM运行。初始化其他一些硬件设备(网络,USB等)。从存储或加载内核映像网络到RAM并启动它。此阶段Shell命令可以使用。

Linux内核:从RAM运行。完全接管系统(引导加载程序bootloader不再存在)。

1.2.2 ARM  TI OMAP2+/AM33xx的引导

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

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 的引导

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

ROM代码:尝试从各种方法中找到有效的引导影像

存储源,并将其加载到RAM中。RAM配置为在特定于CPU的标头中进行了描述,该标头已添加到引导加载程序中图片。

U-Boot:从RAM运行。初始化其他一些硬件设备(网络,USB等)。从存储或加载内核映像网络到RAM并启动它。具有提供的命令的Shell。文件名为u-boot.kwb。

Linux内核:从RAM运行。完全接管系统(引导程序不再存在)。

1.2.4 常见嵌入式处理器的bootloader

本文将重点介绍通用部分,即主要的引导加载程序重要功能。有几种开源的通用引导加载程序。以下是最受欢迎的:

U-Boot,Denx的通用引导程序

最常用于ARM,也可用于PPC,     MI   PS,x86,m68k,NIOS等。

如今已成为事实上的标准。我们将详细研究它。

http://www.denx.de/wiki/U-Boot

Barebox,与体系结构无关的引导程序,是U-Boot的后继产品。它尚不具备U-Boot的硬件支持。U-Boot改善了非常感谢这位竞争对手。

http://www.barebox.org

还有很多其他开源或专有的引导程序,通常特定于架构。如RedBoot,Yaboot,PMON等

2. U-Boot

2.1 介绍

U-Boot是一个典型的免费软件项目

许可证:GPLv2(与Linux相同)

可从http://www.denx.de/wiki/U-Boot免费获得

可从http://www.denx.de/wiki/U-Boot/Documenta  TI on获得文档

Git存储库中提供了最新的开发源代码:

http://git.denx.de/?p=u-boot.git;a=摘要

围绕开放的邮件列表进行开发和讨论,http://lists.denx.de/piperm     ai   l/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_  TI MINGS_DDR3_800E_1066G_1333J=y

# CONFIG_MMC is not set

CONFIG_USB0_VBUS_PIN=“PB10”

CONFIG_VIDEO_COMPOSI     TE   =y

CONFIG_DEFAULT_DEVICE_TREE=“sun5i-r8-chip”

CONFIG_SPL=y

CONFIG_SYS_EXTRA_OP  TI ONS=“CONS_INDEX=2”

# CONFIG_CMD_IMLS is not set

CONFIG_CMD_DFU=y

CONFIG_CMD_USB_MASS_STORAGE=y

CONFIG_AXP_A     LDO   3_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,然后再进行编译

1.制作BOARDNAME_defconfig

2.其中BOARDNAME是配置名称,如configs/目录。

3.然后,您可以运行make menuconfig进一步自定义U-Boot的配置!

确保交叉编译器在PATH中可用

通过指定交叉编译器首选项来编译U-Boot。例如,如果交叉编译器可执行文件是arm-linux-gcc:CROSS_COMPILE= arm-linux-

主要结果是一个u-boot.bin文件,它是U-Boot映像。取决于您的特定平台上,可能还有其他专用映像:u-boot.img

2.4 安装U-Boot

通常必须将U-Boot安装在闪存中才能由硬件执行。取决于硬件,U-Boot的安装以不同的方式完成:

CPU提供了某种特定的引导监视器,您可以使用特定的协议通过串行端口或USB与之进行通信

从固定媒体(NAND)引导之前,CPU首先在可移动媒体(MMC)上引导。在这种情况下,请从MMC引导以刷新新版本

U-Boot已经安装,可以用来发布新版本的U-Boot。但是请注意:如果新版本的U-Boot无法正常工作,则该主板将无法使用

    评估板   提供了一个JTAG     接口   ,该接口允许远程写入闪存,而无需在该评估板上运行任何系统。如果引导加载程序不起作用,它还可以挽救一块板。

2.5 U-boot启动提示信息

通过串行控制台将目标连接到主机。接通     电路   板电源。在串行控制台上,您将看到类似以下内容:

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

U-Boot Shell提供了一组命令。本文将研究最重要的内容,请参阅文档以获取完整参考或help命令。

2.5.1 基本信息命令

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

2.5.2 重要命令

具体的命令集取决于U-Boot配置

help命令,将列出该配置的所有命令,help command,将列出具体命令的使用帮助

ext2load,将文件从ext2文件系统加载到RAM,还有ext2ls列出文件,ext2info以获得信息

fatload,将文件从FAT文件系统加载到RAM,还有fatls和fatinfo

tftp,将文件从网络加载到RAM

ping,用于测试网络的物理连通性

boot,运行默认的启动命令,存储在bootcmd中

bootz 《address》,启动加载到RAM中给定地址的内核映像

loadb,加载,加载,将文件从串行线加载到RAM

usb,用于初始化和控制USB子系统,主要用于USB存储USB钥匙等设备

mmc,用于初始化和控制MMC子系统,用于SD和microSD卡

nand,以擦除,读取和写入NAND闪存中的内容

erase, protect, cp,用于擦除,修改保护以及写入NOR闪存

md,用于显示内存内容。对检查加载到内存中的内容或查看硬件     寄存器   很有用。

mm,用于修改存储内容。出于测试目的,直接修改硬件寄存器常常在调试阶段很有用。

2.5.3 环境变量

U-Boot可以通过环境变量进行配置

1.一些特定的环境变量会影响不同命令的行为

2.可以添加自定义环境变量,并在脚本中使用

在U-Boot启动时将环境变量从闪存加载到RAM,可以对其进行修改并保存回闪存以实现持久性

闪存(或MMC存储器)中有一个专用位置来存储U-Boot环境,该位置在电路板配置文件中定义

环境变量相关的命令:

printenv显示所有变量

printenv 《变量名》 显示变量的值

setenv 《变量名》 《变量值》 仅在RAM中更改变量的值

editenv 《变量名》 仅在RAM中编辑变量的值

saveenv将环境的当前状态保存在闪存中

举例:

 嵌入式Linux引导以及U_Boot移植深度分析_设计制作_电源/新能源

重要的U-Boot环境变量:

bootcmd,指定可配置延迟(bootdelay)后如果引导过程未中断,U-Boot将在引导时自动执行的命令

bootargs,包含传递给Linux内核的参数,稍后介绍

serverip,U-Boot将与网络相关命令联系的服务器的IP地址

i     pad   dr,U-Boot将使用的IP地址

netmask,用于与服务器联系的网络掩码

ethaddr 设置(MAC地址)通常只能设置一次

autostart,如果设置为yes,则U-Boot在将图像加载到内存后自动启动图像(tftp,fatload等)

filesize,最新复制到内存的大小(来自tftp,fatload,nand读取等)

为实现复杂的启动,环境变量可以包含小脚本,以执行多个命令并测试命令结果。

脚本对于自动启动或升级过程很有用

可使用链接多个命令,使用分号操作符;

条件表达式:if command ;then 。。。 ; else 。。。 ; fi

使用运行《variable-name》执行脚本

您可以使用${variable-name}引用其他变量

举例:

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主要用于加载和引导内核映像,但是它也允许更改内核映像和存储在闪存中的根文件系统。必须在目标和开发工作站之间交换文件。

可能的方法:

如果目标设备具有     以太网   连接,并且U-Boot包含用于以太网芯片的驱动程序,则通过网络。这是最快,最有效的解决方案。

如果U-Boot在使用的平台支持USB控制器,则可以通过U盘

如果U-Boot在使用的平台支持MMC控制器,则可以通过SD卡或microSD卡

通过串口,但一般效率较低

通过TFTP:

将文件通过TFTP网络从开发工作站(Host)传输到目标机(Target)上的U-Boot。是一种普通文件传输协议,类似于FTP,但是没有身份验证并且采用UDP传输层协议

开发工作站上需要配置TFTP服务器,可参照下列步骤进行配置

1.sudo apt install tftpd-hpa

2. 所有位于开发工作站上/var/lib/tftpboot中的文件对于TFTP

3.tftp-hpa软件包中提供了TFTP客户端,可用于测试

TFTP服务器是否搭建成功 TFTP客户端已集成到U-Boot中,通过以下步骤进行配置测试

1.配置ipaddr以及serverip环境变量

2.使用tftp 《address》《filename》 加载文件进行传输。

5
153
0
41

相关资讯

  1. 1、Win7系统怎样设置打印机共享?Win7系统设置打印机共享的方法734
  2. 2、快用苹果助手如何给手机传视频?快用苹果助手给手机传视频的方法步骤542
  3. 3、Win10电脑玩一会游戏卡死画面定格如何解决?4685
  4. 4、wps中怎么输入都带指定宇?wps中输入都带指定宇的方法412
  5. 5、PDF文件如何转换成JPG图片?1062
  6. 6、抖音猫咪摇头蹦迪表情包怎么发?抖音5只猫点头表情包下载297
  7. 7、电脑屏幕上有许多彩色小点怎么回事?1217
  8. 8、支付宝如何进行学生认证?支付宝学生认证的操作步骤3691
  9. 9、怎么不让迅雷接管其它下载?怎么不用迅雷下载而用本地下载?4252
  10. 10、怎么打开360安全卫士优化记录?360安全卫士优化记录打开的方法3281
全部评论(0)
我也有话说
0
收藏
点赞
顶部