您的位置 首页 编程

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

嵌入式Linux引导以及U-Boot移植深度分析-引言:本文简明扼要的介绍了嵌入式Linux的引导过程,X86体系的引导过程以及几种常见嵌入式处理器的引导过程,U-Boot的移植的基本步骤、常用命令如何使用。通过本文可以对嵌入式Linux的引导从概念到实际操作有一个总体清晰的认识 1.启动顺序 1.1 Bootloader Bootloader(引导加载程序)本质上是一小段程序,其基本功能在于: 基本的硬件初始化 从闪存存储,网络或其他类型的非易失性存储中加载应用程序二进制文件(通常是操作系统内核)。 可能会对应用

  导言:本文短小精悍的介绍了嵌入式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》 加载文件进行传输。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/94184.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部