导言:本文短小精悍的介绍了嵌入式Linux的引导进程,X86体系的引导进程以及几种常见嵌入式处理器的引导进程,U-Boot的移植的根本进程、常用指令怎么运用。经过本文能够对嵌入式Linux的引导从概念到实际操作有一个整体明晰的知道
1.发动次序
1.1 Bootloader
Bootloader(引导加载程序)本质上是一小段程序,其根本功用在于:
根本的硬件初始化
从闪存存储,网络或其他类型的非易失性存储中加载应用程序二进制文件(一般是操作体系内核)。
或许会对应用程序二进制文件进行解压缩
履行请求
除此根本功用之外,大多数Bootloader(引导加载程序)完结了Shell指令集以履行不同操作。
从存储或网络中加载数据,内存检查,硬件确诊和测验等
1.2 根据BIOS-X86的引导
x86处理器一般装置在在一块包括BIOS程序的非易失性存储器主板上。
在根据BIOS的旧x86渠道上:BIOS担任根本的硬件初始化和从非易失性存储中加载一小段代码。
这段代码一般是榜首阶段的引导程序bootloader,它将加载完好的引导程序bootloader自身。
bootloader能够解析文件体系,因而内核映象能够直接从一般文件体系中加载。
此次序与现代根据EFI的体系不同。
用于X86体系Linux的bootloader常用的有以下两种:
GNU GRUB(GRand UnifiedBootloader简称“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/utils/boot/syslinux/
1.3 嵌入式CPU的引导
Case 1:CPU内部无引导代码
CPU上电后,CPU开端在固定地址进口履行代码
CPU没有供给其他引导机制
硬件规划有必要保证已衔接存储芯片(如NOR闪存芯片)这样就能够在CPU发动的地址拜访它并履行指令
榜首级引导程序有必要在此地址编程在该存储芯片中(如NOR)
NOR是强制性的,由于它答应随机拜访,NAND不答应
注:这种计划已不常用,由于需求NOR FLASH
Case2:CPU内具有引导代码
CPU在ROM中具有集成的引导代码。如:AT91 CPU上的BootROM,OMAP上的“ ROM代码”,等等。详细细节取决于CPU体系结构
此引导代码能够将榜首级引导加载程序从存储设备加载到内部SRAM(由于DRAM没有初始化)。 存储设备一般可所以:MMC,NAND,SPI闪存,UART(经过串行线传输数据)等等。
榜首阶段的引导程序: 由于硬件约束,尺度有限(SRAM比较贵), 由CPU供货商或社区项目供给
此榜首阶段引导程序有必要初始化DRAM和其他硬件设备,并将第二阶段的引导程序加载到RAM
由于本文专心嵌入式范畴,故接下来将描绘几种常见的嵌入式处理器的引导进程。
1.2.1 ARM Microchip AT91的引导
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的引导
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 的引导
ROM代码:测验从各种办法中找到有用的引导印象
存储源,并将其加载到RAM中。RAM装备为在特定于CPU的标头中进行了描绘,该标头已增加到引导加载程序中图片。
U-Boot:从RAM运转。初始化其他一些硬件设备(网络,USB等)。从存储或加载内核映像网络到RAM并发动它。具有供给的指令的Shell。文件名为u-boot.kwb。
Linux内核:从RAM运转。彻底接收体系(引导程序不再存在)。
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等
2. 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_MMC is not set
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_IMLS is not set
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,然后再进行编译
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发动提示信息
经过串行操控台将方针衔接到主机。接通电路板电源。在串行操控台上,您将看到相似以下内容:
U-Boot Shell供给了一组指令。本文将研讨最重要的内容,请参阅文档以获取完好参阅或help指令。
2.5.1 根本信息指令
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将环境的当时状况保存在闪存中
举例:
重要的U-Boot环境变量:
bootcmd,指定可装备推迟(bootdelay)后假如引导进程未中止,U-Boot将在引导时主动履行的指令
bootargs,包括传递给Linux内核的参数,稍后介绍
serverip,U-Boot将与网络相关指令联络的服务器的IP地址
ipaddr,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》 加载文件进行传输。