uboot和bootloader有啥区别

uboot和bootloader都是嵌入式设备中用来启动操作系统内核的一段程序,但是:

uboot是一种通用的、可移植的、支持多种处理器架构的bootloader,

bootloader是一个泛指,可以有很多不同的实现,例如Redboot、ARMboot、Blob等。

uboot是bootloader的一个子集,也就是说uboot是一种特定的bootloader。

uboot的核心作用就是启动操作系统内核,uboot的本质就是一段裸机程序。

uboot还可以提供一些其他的功能,例如:

  • 硬件管理:uboot可以初始化和控制Soc内部外设和板级外设,为操作系统提供硬件环境。
  • 镜像烧录(刷机):uboot可以通过串口、网口、SD卡等方式将操作系统或应用程序的镜像文件写入到Flash或其他存储设备中。
  • 命令式shell界面:uboot可以通过串口或网口与用户交互,执行用户的命令,例如修改配置参数、测试硬件、下载文件等。
  • 调试支持:uboot可以与GDB等调试工具进行通信,调试应用程序或内核。

uboot的执行模式有两种,一种是自启动模式,另一种是交互模式。

  • 自启动模式下,uboot按照预先设定的命令自动运行,从存储设备或网络上加载操作系统内核并启动。
  • 交互模式下,uboot等待用户的输入,提供命令行接口,执行用户的指令。uboot的交互模式通常用于系统开发和更新的过程中,而uboot的自启动模式通常用于系统发布和正常运行的情况下。

uboot的目录结构如下:

- arch:存放各种处理器架构的相关代码,例如arm、mips、x86等。
- board:存放各种开发板的相关代码,例如配置文件、初始化函数等。
- common:存放通用的代码,例如命令行解析、内存管理、串口驱动等。
- drivers:存放各种设备驱动的代码,例如网卡、LCD、USB等。
- fs:存放文件系统的代码,例如fat、jffs2、ext4等。
- include:存放头文件,包括通用的头文件和各个平台的头文件。
- lib:存放库函数的代码,例如字符串处理、数学运算、压缩解压等。
- net:存放网络相关的代码,例如协议栈、网络命令、网络驱动等。
- tools:存放一些辅助工具的代码,例如mkimage、envcrc等。

uboot的命令有很多,可以分为以下几类:

- 基本命令:例如help、version、reset等,用于查看帮助信息、版本信息、重启系统等。
- 存储命令:例如saveenv、loadenv、erase、cp等,用于保存、加载、擦除、复制存储设备中的数据。
- 内存命令:例如md、mw、cmp、crc等,用于显示、修改、比较、校验内存中的数据。
- 文件命令:例如fatload、fatls、ext2load、ext2ls等,用于从文件系统中加载或列出文件。
- 网络命令:例如ping、tftp、dhcp、bootp等,用于测试网络连通性、从网络上下载或上传文件、获取网络参数等。
- 启动命令:例如bootm、bootz、booti等,用于从内存中启动操作系统内核。
- 其他命令:例如printenv、setenv、test、run等,用于打印、设置、测试、运行环境变量。

 一个嵌入式系统从软件角度来看分为三个层次:


1.引导加载程序
包括固化在固化中的boot程序(可选),和BootLoader两大部分
2.linux内核
特定于嵌入式平台的定制内核
3.文件系统
包括了系统命令和应用程序

 BootLoader-->Boot Parameters-->Kernel-->Root Filesystem


为什么需要进行bootloader移植?
答:1.因为每种不同的CPU体系结构都有不同的BootLoader
        2.BootLoader依赖于具体的嵌入式板级设备的配置


BootLoader启动过程可分为单阶段和多阶段(stage1、stage2),

stage1完成初始化硬件,如CPU寄存器、内存控制器,为stage2准备内存空间。一般stage1是可以直接在nor flash中运行的,并将stage2复制到内存RAM中,设置堆栈。然后跳转到stage2(从这也可以看出stage2是在RAM中运行的,与stage1不同)

 BootLoader的stage1通常包括以下步骤:
1.硬件设备初始化  如CPU寄存器、内存控制器
2.为加载BootLoader的stage2准备RAM空间
3.拷贝BootLoader的stage2到RAM空间中
4.设置好堆栈 为什么?为了跳转到stage2的入口,因为stage2大多数是用C语言写的
5.跳转到stage2的C入口点

BootLoader的stage2通常包括以下步骤:
1.初始化本阶段要使用到的硬件设备    各种设备,如网卡
2.将内核映像和根文件系统映像从flash上读到RAM中去
3.调用内核

参考链接:
(1) u-boot 和 bootloader 的区别 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/412811721.
(2) 嵌入式Linux移植和Uboot(一):Bootloader介绍,U-boot介绍(特点,目录结构) - 知乎. https://zhuanlan.zhihu.com/p/194357198.
(3) u-boot 和 bootloader 的区别-腾讯云开发者社区-腾讯云. https://cloud.tencent.com/developer/article/1885927.
(4) u-boot和bootloader的区别-CSDN博客. https://blog.csdn.net/ybhuangfugui/article/details/120340489.
(5) u-boot 和 bootloader 的区别 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/412811721.
(6) 嵌入式Linux移植和Uboot(一):Bootloader介绍,U-boot介绍(特点,目录结构) - 知乎. https://zhuanlan.zhihu.com/p/194357198.
(7) u-boot 和 bootloader 的区别-腾讯云开发者社区-腾讯云. https://cloud.tencent.com/developer/article/1885927.
(8) u-boot和bootloader的区别-CSDN博客. https://blog.csdn.net/ybhuangfugui/article/details/120340489.

 

BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。

BIOS是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

BIOS,Basic Input Output System 基本输入输出系统,意思是主板级别的一个小系统。

负责系统(主要是主板)的硬件初始化,例如CPU,内存,硬盘,键盘,显卡,网卡等等硬件的初始化。初始化是BIOS的主要工作。

传统的个人电脑上面BIOS会有一个int19 软件中断功能,在初始化完成后,BIOS会进入int19中断,寻找启动介质,如软盘,光盘,硬盘,flash或者网络等等,读取第一个扇区的内容到内存的0000:7C00处,跳入这个地址执行。

这里int19就是一个bootloader,启动引导器。所以BIOS具有Boot Loader的功能。当然,目前的BIOS功能已经被扩充了很多,例如电源管理方面的ACPI接口,USB驱动,PXE网络引导功能,硬盘加密,TPM接口,BIOS配置界面,BIOS自动恢复等等。

 BootLoader

BootLoader是一段小程序,可以把它想象成PC机linux上的GRUB/LILO引导程序,只不过在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。


uboot 
Uboot用于多种嵌入式CPU的BootLoader程序
支持多种嵌入式操作系统的引导
UBOOT目录结构
1.Borad        与开发板有关的文件。第一个开发板都以一个子目录出现在当前目录中
2.Common    实现Uboot支持的命令
3.Cpu        与特定CPU架构相关的代码,支持的CPU对应一个子目录(注意CPU与开发板的区别)
3.Disk        对磁盘的支持
4.Doc        文档目录
5.Drivers    Uboot支持的设备驱动程序  如各种网卡、串品、USB、支持CFI的Flash
6.Fs         文件系统的支持
7.Iclude    Uboot使用的头文件。该目录下configs目录有与开发板相关的配置头文件        该目录下的asm目录有与CPU体系结构相关的头文件
8.Net        与网络协议相关的代码    各路协议的实现
9.Tools        生成Uboot的工具,如:mkimage,crc等等

Uboot编译分为两步:
1.执行每种board相关的配置    如:make amdk_2420
2.编译生成uboot.bin文件        如:make CROSS_COMPILE=arm-linux-(指定正确路径)
 

UBOOT基于单板机提供了丰富的命令集操作
UBOOT命令
printenv 查看环境变量(相当全局变量?)
setenv   添加、修改、删除环境变量
1.setenv name value
set environment variable 'name' to 'value...'
2.setenv name
delete environment variable 'name'
saveenv保存环境变量
将当前定义的所有变量及其值存入flash中
---------------------文件下载------------------------------------
tftp 通过网络下载文件     使用前,配置好网络
配置网络:

1.setenv ethaddr 12:34:56:78:8A:BC
2.setenv ipaddr 192.168.1.1
3.setenv serverip 192.168.1.254  (tftp服务器的地址)
连接下载:tftp 32000000 uImage
把server(IP=环境变量中设置的serverip)服务目录下的uImage通过tftp读入到0x32000000处

md 显示内存区的内容
md[.b,.w,.l]address    如:md.w 1000000

mm[.b,.w,.l]address    如:mm.w 100000
mm 修改内存,地址自动递增    提供了一种互动修改存储器内容的方法,如果没有输入任何值,按回车内容保持不变,输入空格然后按下回车,结束输入

flinfo    查看Flash扇区信息
--------------------------------------------------------------------------------
protect Flash写保护  打开或关闭扇区写保护
用法:
protect off all        关闭所有扇区的写保护
protect on all         打开所有扇区的写保护
protect off start end     关闭从start到end扇区的写保护-----》protect off 0 1ffff(前一扇区减去1?)
protect on start end     打开从start到end扇区的写保护

--------------------------------------------------------------------------------

erase 擦除flash扇区
用法: erase start end    如: erase 30000 1efff
在使用cp命令向Nor型Flash写入数据之前必须先使用erase命令擦除flash

cp 数据拷贝
cp [.b,.w,.l]saddress daddress len
cp提供了一种内存与内存,内存与Flash之间数据拷贝的方法
如:cp.b 31000000 50000 d0000 即是将内存地址0x31000000处的数据(长度为0xd0000)拷贝到地址0x50000处(Flash中)

--------------------------------------------------------------------------------
执行程序
go 执行内存中的二进制代码,一个简单的跳转到指定地址
go addr[arg...]
start application at address 'addr',
passing 'arg' as arguments

bootm 执行内存中的二进制代码
bootm [addr[arg...]]       要求二进制代码有固定格式的文件头
boot application image stored in memory passing arguments 'arg...';
when booting a Linux kernel,'arg' can be the address of an initrd image
bdinfo    显示开发板信息  (可用于启动linux内核)
bdinfo命令将在终端显示诸如内存地址和大小、时钟频率、MAC地址等信息
这些信息在传递给LIUNX内核一些参数时可能会用到

设置自动启动
setenv bootcmd tftp 31000000 uImage \;bootm 31000000
saveenv

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值