0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从概念到实际操作对嵌入式Linux的总体认识

电子设计 来源:电子设计 作者:电子设计 2020-10-30 11:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文简明扼要的介绍了嵌入式 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》 加载文件进行传输。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5188

    文章

    20172

    浏览量

    329246
  • Linux
    +关注

    关注

    88

    文章

    11635

    浏览量

    218102
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    什么是嵌入式操作系统?

    要理解嵌入式操作系统(Embedded Operating System,简称 RTOS/EOS),我们可以本质定义→核心区别→实际作用→典型特征→
    发表于 12-09 10:33

    分享一个嵌入式开发学习路线

    法,这些语法在嵌入式开发中至关重要。 2. 技能进阶期(2-3个月) 51单片机过渡到主流的ARM Cortex-M系列(嵌入式就业核心平台),学会使用STM32单片机,掌握嵌入式
    发表于 12-04 11:01

    嵌入式实时操作系统的特点

    实时嵌入式操作系统(Real-Time Embedded Operating System)是专门设计用于嵌入式系统的实时操作系统。嵌入式
    发表于 11-13 06:30

    功率芯片PCB嵌埋封装“概念到量产”,如何构建?

    以下完整内容发表在「SysPro电力电子技术」知识星球-《功率芯片嵌入式封装:概念到量产的全链路解析》三部曲-文字原创,素材来源:TMC现场记录、西安交大、网络、半导体厂商-本篇为节选,完整内容
    的头像 发表于 09-20 12:01 2261次阅读
    功率芯片PCB嵌埋<b class='flag-5'>式</b>封装“<b class='flag-5'>从</b><b class='flag-5'>概念到</b>量产”,如何构建?

    嵌入式入门到进阶,怎么学?

    嵌入式入门到进阶,怎么学? 嵌入式学习的核心是 “软硬结合的技术壁垒”,科学分层才能高效突破。以下是入门到高阶的精简路线,帮你避开弯路: 1、基础奠基层:构建技术底座 C 语言聚焦
    发表于 09-02 09:44

    入行嵌入式应该怎么准备?

    架构、总线协议和存储器管理等概念的理解也是必不可少的。 三、操作系统嵌入式系统通常需要运行一个实时操作系统(RTOS)或者一个精简版的操作
    发表于 08-06 10:34

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】+基础概念学习理解

    。为了对珠峰更了解些,开始接触 Linux 系统开发,并逐渐认识到 Yocto 项目在定制嵌入式 Linux 系统方面的重要性。所以很想拜读下此书。 二、书籍内容概述 基础知识 书中首
    发表于 08-04 22:29

    怎么结合嵌入式Linux,和FPGA三个方向达到一个均衡发展?

    嵌入式领域,不少人都怀揣着让嵌入式Linux 和 FPGA 三个方向实现均衡发展的梦想,然而实践中却面临诸多挑战。就像备受瞩目的全栈工程师稚晖君,他大学玩单片机起步,凭借将智能算
    的头像 发表于 06-25 10:08 664次阅读
    怎么结合<b class='flag-5'>嵌入式</b>,<b class='flag-5'>Linux</b>,和FPGA三个方向达到一个均衡发展?

    Linux嵌入式和单片机嵌入式的区别?

    Linux嵌入式与单片机嵌入式在多个方面存在显著的区别,以下是详细的比较和归纳: 一、基本概念 1. Linux
    发表于 06-20 09:46

    嵌入式开发入门指南:从零开始学习嵌入式

    特定功能的计算机系统,广泛应用于智能家居、工业控制、医疗设备、车载系统等领域。 2. 学习嵌入式开发的前置知识熟悉C语言编程掌握基本的数据结构与算法了解数字电路与微控制器原理熟悉Linux操作
    发表于 05-15 09:29

    怎么嵌入式linux下控制dlp?

    请问怎么嵌入式linux 下控制dlp,有没有支持
    发表于 03-03 07:02

    【入门必看】菜鸟到大牛,嵌入式系统完整学习路线!看这篇就够了!

    嵌入式Linux”的顺序帮助您入门到进阶,掌握嵌入式开发的精髓。第一阶段单片机单片机是嵌入式学习的基石,因为它集成了处理器、存储器和输入
    的头像 发表于 02-20 10:53 3240次阅读
    【入门必看】<b class='flag-5'>从</b>菜鸟到大牛,<b class='flag-5'>嵌入式</b>系统完整学习路线!看这篇就够了!

    如何成为嵌入式开发工程师?

    ,参加相关的研讨会和培训课程,阅读专业书籍和论文。 9. 认证和网络:- 考虑获取相关认证,这可以增加你的市场竞争力。- 加入专业组织和在线社区,扩展你的人际网络。 通过上述步骤的学习和实践,你可以逐步成长为一名合格的嵌入式开发工程师。记住,实际动手做项目和解决
    发表于 02-19 10:39

    RT-Thread嵌入式操作系统专业培训班登陆郑州!

    RT-Thread官方将在河南-郑州发起为期三天的嵌入式操作系统专业培训班!本次培训将深入讲解RT-Thread嵌入式实时操作系统的核心概念
    的头像 发表于 02-12 18:28 732次阅读
    RT-Thread<b class='flag-5'>嵌入式</b><b class='flag-5'>操作</b>系统专业培训班登陆郑州!

    嵌入式主板的概述与发展

    随着科技的迅猛发展,嵌入式系统在现代电子产品中扮演着越来越重要的角色。嵌入式主板作为嵌入式系统的核心组件之一,承担着控制、处理和通讯等多种功能。本文将对嵌入式主板的基本
    的头像 发表于 01-13 16:30 1200次阅读
    <b class='flag-5'>嵌入式</b>主板的概述与发展