一、boot为什么有启动、开机的意思?
"Boot"一词源于英语单词"bootstrap(靴筒后的拉绳)",最初是指通过拉起靴子上的拉绳来穿上靴子。在计算机领域中,"boot"被用来表示计算机系统的启动过程,即将计算机从关机状态转换为可运行操作系统的状态。
计算机的启动过程涉及一系列步骤,其中包括硬件初始化、加载引导程序和操作系统等。当计算机通电或重启时,它会首先执行一些基本的硬件初始化操作,例如检测和配置内存、外围设备等。然后,计算机会加载引导程序(Bootloader),这是一个特殊的软件,负责启动操作系统。
引导程序的主要任务是将操作系统加载到计算机的内存中,并将控制权交给操作系统,使其能够开始执行。引导程序通常存储在计算机的固件中,例如BIOS(基本输入/输出系统)或UEFI(统一可扩展固件接口)。引导程序还可以提供其他功能,如设备驱动程序加载、启动参数设置等。
因此,"boot"一词在计算机领域中用来表示整个启动过程,它涉及从关机状态开始,逐步加载和配置系统组件,最终使得计算机能够运行操作系统并进入可用状态。
由上图可以看出,U-Boot是通用的引导程序,对硬件和系统没有要求,支持所有主流架构的芯片,所以,U-Boot是当今最流行的嵌入式引导加载程序。
二、 U-Boot是什么?
U-Boot是Das U-Boot的简写。
u-boot全称 Universal Boot Loader,是遵循GPL条款的开放源码项目,U-Boot的作用是系统引导。
U-Boot是一款开源的引导加载程序(Bootloader),可用于嵌入式系统中。它由德国的DENX公司开发,支持多种处理器架构,包括ARM,MIPS,PowerPC等。
百度百科:U-Boot不仅仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS, android。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和执着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。
①创始人以及起源:
Uboot学习(二)之Uboot能够实现哪些功能-腾讯云开发者社区-腾讯云
这里我们简单来了解一下Uboot的由来。Uboot一开始是由一个德国大神Magnus Damm(马格努斯 达姆) 发起的一个项目,这个项目后面被 Wolfgang Denk (沃尔夫冈 登克)转移到了 SourceFore.net 上来了,但是SourceForge.net上不允许以数字来开头的项目命名名称,所以改名为 PPCBoot。PPCBoot 在 2000 年 7 月 19 日 第一次被公开发布出来了;其实, Uboot 从 FADSROM、8xxROM、PPCBOOT逐步发展演化而来的。这期间被很多人使用,甚至被许多Soc(System on Chip的缩写,称为芯片级系统,也有称片上系统,意指它是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。)厂商支持,这更加推动了 Uboot的广泛使用了。最终,Uboot经过多年发展,已经成为业内 bootloader (引导程序)标准了,而且现在大部分的嵌入式设备都会默认使用 Uboot 来作为 bootloader了。
用U-BOOT构建嵌入式系统的引导装载程序 _wolfgang denk_yangfei_1108的博客-CSDN博客
U-BOOT是由德国的工程师Wolfgang Denk从8XXROM代码发展而来的,它支持很多处理器,比如PowerPC、ARM、MIPS和x86。目前,U-BOOT源代码在sourceforge网站的社区服务器中,Internet上有一群自由开发人员对其进行维护和开发,它的项目主页是http://sourceforge.net/projects/U-BOOT。U-BOOT的最新版本源代码可以在Sourceforge的CVS服务器中匿名获得。
#cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT login
#cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/U-BOOT / co -P modulename
② 创始人去世
沃尔夫冈·登克
斯特凡诺·巴比伦的 伦敦的斯巴比奇
Fri Oct 21 17:11:33 CEST 2022亲爱的U-Boot社区, 我很遗憾地通知你,沃尔夫冈·登克, 上周去世了。我们失去了一个伟大的开发者 好朋友。 我在25年前第一次见到沃尔夫冈,那时我们在 同样的公司。我被雇为顾问(当时 经常使用的)实时操作系统。我没时间介绍我,因为沃尔夫冈 打断我的话:"只要安装Linux!"。我当然知道了。它 是他给我的第一个好建议。很多人也跟着。 沃尔夫冈是当时开源的先驱者和坚定支持者。 当Linux为嵌入式系统启动了它的第一步。在许多情况下 他与客户进行了激烈的讨论,以解释 开放源代码的优势,他拒绝了商业合同 客户违背了他的原则。我们会想念他的。 安息吧,朋友 斯特凡诺·巴比伦的 -- ===================================================================== 丹克斯软件工程有限公司,常务董事:沃尔夫冈丹克 慕尼黑,办事处:德国,格罗斯贝尔。 Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: 伦敦的斯巴比奇
③denx公司DENX Software Engineering – the Embedded Linux Experts
扩展文章:
站在芯片原厂角度移植最新u-boot 2020.07到jz2440开发板(1)(全部驱动使用设备树与dm设备模型) | 码农家园 【嵌入式】构建嵌入式Linux系统(uboot、内核、文件系统) - 知乎
2 -- uboot的介绍-mingrentian-ChinaUnix博客
1.u-boot的简介
u-boot 全称Universal Boot Loader, 即通用bootloader,是德国的DENX软件工程中心开发的遵循GPL条款的开源项目,从它的名字就可以看出来u-boot的雄心,不过u-boot现在也确实是嵌入式平台上用的最多的bootloader了,其支持powerpc, arm, mips, x86等等架构(不过我还没有见过用u-boot引导的pc机^_^)。u-boot的下载地址是ftp://ftp.denx.de/pub/u-boot/。
这里提一下DENX,uboot让DENX享誉全球,以前uboot还在sourceforge发布,不过现在新版本只能在DENX的网站上才能下到了,最新版本是09年3月发布的,除了u-boot之外,他们还开发了比较有名的denx linux(一种嵌入式linux的SDK包,支持平台powerpc, arm, mips,里面有完整的kernel, filesystem, uboot, 目前最新版本的内核为2.6.25),整合的很不错,现在有很多公司都推荐使用denx 的ELDK(Embedded Linux Development Kit ), 有兴趣的朋友可以试试。
2.u-boot的制作
如果当前的u-boot支持你的平台,制作u-boot是非常简单的,你只需要按照下面的流程进行编译:
make clean
make distclean
make smdk2410_config
make
之后得到的u-boot.bin就是你的目标文件,但是仅仅知道上面的几个步骤没有任何意义,因为很多的时候uboot里面并没有你的开发板平台对应的配置项,而只有相似平台的,在这种情况下我们应该如何处理了?这里首先需要介绍一下u-boot的源码结构。
uboot下面的README和docs中有很多开发和使用文档,其实现在网上的u-boot移植的方法都是按照那些文档来作的,只可惜是英文,读起来比较郁闷,不过有位朋友翻译了README中的一小部分,网址是http://blog.ednchina.com/longhaihai/174867/message.aspx,感兴趣的朋友可以自己去看。
3.u-boot的源码结构
子目录 | 描述 |
board | 开发板相关 |
common | 通用的函数 |
cpu | cpu相关,对应不同的架构的cpu,子目录进一步细分了 |
disk | 磁盘驱动和相关的操作代码 |
doc | 开发文档,还有使用文档 |
lib_generic | 通用库函数 |
lib_xxx | xxx架构下的通用文件 |
libfdt | 支持平台设备树的库, 基于open firmware结构,一般不会用到 |
driver | 各类设备的驱动,根据平台配置会编译不同的驱动 |
fs | 文件系统 |
include | 头文件和开发板的配置文件 |
net | 网络子系统 |
nand_spl | 支持从nand flash启动,但支持的cpu的种类也不是很多 |
onenand_ipl | 支持从onenand(三星公司开发的结合了nand和nor技术的flash)启动的代码 |
post | 上电自检程序 |
tools | 制作S-Record(motorola 制定的一种烧写格式,很简单),u-boot镜像等的工具 |
example | 一些可以在u-boot上运行的小示例程序 |
api | 一些扩展应用的独立的api |
api_example | api的示例程序 |
看了上面的源码目录结构,不知你是否发现,它跟内核的目录结构有一定的相似,仔细想想就不难明白,其实u-boot就是一个嵌入式系统,他跟那些大的,复杂的系统本质上并没有区别,都是可以让一个平台正常的工作,有驱动,文件系统,网络子系统,post,也有运行其上的应用程序等等,只是他只支持单进程,不能提供像linux中的复杂调度机制,虽然也有上面那些子系统,但是整个结构很简单,只能实现最基本的功能。这就是u-boot。它按照一定的规则将那些复杂的系统给启动起来,复杂的工作全都交给上面的来做,仅此而已。
但是虽说相对linux kernel u-boot很简单,它却是研究嵌入式系统的很好的选择,如果你能研究清楚他的结构,对你理解整个嵌入式系统的原理会很有帮助的,同时,你也可以想想为什么说我们把它的那部分启动代码放到内核中去是可以做到的,放到u-boot的前面和放到kernel的前面从本质上是没有区别的
扩展1:
TFTP启动和NFS启动都需要使用网络连接,通常需要使用网线进行物理连接。
对于TFTP启动,TFTP(Trivial File Transfer Protocol)是一种基于UDP的简单文件传输协议,它通过网络传输内核镜像或其他文件到目标设备进行启动。为了进行TFTP启动,目标设备需要与TFTP服务器通过网络连接,并使用网线将它们连接在一起,以进行文件传输。
对于NFS启动,NFS(Network File System)是一种在网络上共享文件系统的协议。在NFS启动中,目标设备需要通过网络连接到NFS服务器,并进行文件系统的挂载。这也需要使用网线将目标设备和NFS服务器物理连接在一起,以便进行网络通信和文件系统访问。
需要注意的是,对于TFTP启动和NFS启动,网络连接不仅限于有线连接,也可以使用无线网络连接,例如通过Wi-Fi进行网络通信。但无论是有线连接还是无线连接,都需要确保网络连接的可靠性和稳定性,以保证文件传输和挂载的正确进行。
扩展2:
TFTP (远程/网络内核) 使用 U-Boot 和 NFS (远程/网络用户空间) 使用 U-Boot 是 U-Boot 引导加载程序中两种不同的启动方式。
TFTP (Trivial File Transfer Protocol) 是一种简单的文件传输协议,用于通过网络将文件从服务器传输到客户端。在 U-Boot 中,使用 TFTP 启动意味着 U-Boot 从网络中下载内核镜像(通常是 Linux 内核)到嵌入式设备的内存中,然后将控制权转交给该内核运行,实现系统的启动。这种方式适用于基于网络的系统,可以快速、方便地更新和调试内核。
NFS (Network File System) 是一种网络文件系统协议,允许远程主机通过网络访问和共享文件。在 U-Boot 中,使用 NFS 启动意味着 U-Boot 通过网络挂载远程服务器上的根文件系统,然后将控制权转交给该根文件系统中的用户空间程序,实现系统的启动。这种方式适用于需要远程访问文件系统的场景,可以实现灵活的文件共享和集中管理。
这两种方式的主要区别在于启动过程中涉及的内容。TFTP 启动主要关注内核的下载和运行,内核负责设备的初始化和系统的管理;而 NFS 启动主要关注根文件系统的挂载和用户空间的启动,用户空间负责应用程序的执行和系统的功能。因此,TFTP 启动更加适用于只需关注内核的嵌入式系统,而 NFS 启动更适用于需要远程文件系统和用户空间功能的嵌入式系统。
需要注意的是,两种启动方式并不是互斥的,可以根据具体需求选择适合的方式,甚至可以结合使用,例如先使用 TFTP 下载内核,然后使用 NFS 挂载根文件系统。
扩展3:
就性能而言,TFTP启动和NFS启动在几个方面可能存在区别:
传输速度:TFTP通常比NFS更快,因为TFTP是一种简单的文件传输协议,仅提供基本的文件传输功能。它使用UDP协议进行传输,没有复杂的认证和授权过程,因此传输速度相对较快。而NFS使用TCP协议进行传输,它提供更多的功能和特性,但相对于TFTP而言,可能会带来更多的开销和传输延迟。
存储空间占用:TFTP启动通常需要一个较小的内核镜像,因为它只涉及到内核的下载和运行。这可以节省存储空间,并且加快了启动过程。相比之下,NFS启动需要挂载完整的根文件系统,包括用户空间程序和库文件,可能需要更大的存储空间。
启动时间:由于TFTP启动仅涉及内核的下载和运行,启动时间通常较短。而NFS启动需要挂载远程的根文件系统,可能需要更多的网络交互和文件系统操作,启动时间可能会稍长一些。
需注意的是,性能方面的差异可能会受到网络带宽、远程服务器性能、文件系统大小等因素的影响。实际性能差异会因具体的系统配置和环境而异,因此在选择启动方式时,需要根据实际需求和系统限制进行评估和测试。
扩展4:
下面是TFTP启动和NFS启动在实际工作场景中的一些示例:
TFTP启动的实际工作场景:
- 嵌入式设备固件更新:在嵌入式设备的生产环境中,使用TFTP启动可以方便地将新的固件或软件更新下载到设备中,以更新设备的功能和修复漏洞。
- 网络启动和远程调试:在开发和调试过程中,使用TFTP启动可以通过网络快速下载和启动内核,用于调试和测试新的功能和驱动程序。
- 系统恢复和故障排除:当嵌入式系统遇到问题或发生故障时,使用TFTP启动可以方便地加载备份的内核镜像,以便进行系统恢复和故障排查。
NFS启动的实际工作场景:
- 服务器集群和分布式系统:在服务器集群和分布式系统中,使用NFS启动可以实现根文件系统的共享和集中管理,简化了服务器的配置和维护。
- 远程开发和测试环境:对于需要在远程服务器上进行开发和测试的场景,使用NFS启动可以通过挂载远程的根文件系统,方便地共享代码和资源,并进行远程调试和测试。
- 虚拟化环境:在虚拟化环境中,使用NFS启动可以将虚拟机的根文件系统存储在共享的NFS服务器上,实现虚拟机的快速启动和动态迁移。
扩展5:
U-Boot和Linux都是开源项目,各自有其特定的开发难度。然而,无法简单地说一个项目的开发难度比另一个项目更大,因为这涉及到多个因素和个人观点。
U-Boot是一个用于嵌入式系统的开源引导加载程序,主要负责初始化硬件、加载操作系统以及提供基本的系统启动功能。U-Boot的开发难度在于需要理解和处理各种硬件平台的细节和特性,包括处理器架构、外设、内存管理等。此外,U-Boot还需要与各种外部设备和协议进行交互,如存储设备、网络接口等。因此,对于开发者来说,熟悉硬件和底层系统知识是理解和贡献U-Boot的关键。
Linux是一个广泛使用的开源操作系统内核,具有复杂性和多样性。它支持多种硬件架构和设备,并提供丰富的功能和子系统,涵盖了内存管理、进程调度、文件系统、网络堆栈等众多领域。Linux的开发难度在于理解和掌握庞大的代码库、复杂的内核架构和子系统之间的相互关系。此外,Linux内核开发还需要考虑到对不同硬件平台的支持、性能优化、稳定性和安全性等方面的挑战。
总体而言,U-Boot和Linux都是复杂的开源项目,它们的开发难度取决于开发者的经验、背景知识和所涉及的具体任务。对于某些开发者来说,熟悉硬件和底层系统可能更具挑战性,而对于其他开发者来说,理解和贡献复杂的操作系统内核可能更具挑战性。因此,无法一概而论哪个项目的开发难度更大,而应根据具体情况和个人兴趣来评估。
扩展6:裸板烧写U-Boot以及先进入u-boot环境的情况下烧写新的u-boot,操作方式有什么区别?
在裸板烧写U-Boot和在已经进入 U-Boot 环境下烧写新的 U-Boot,操作方式有一些区别。下面我将简要说明这两种情况下的操作方式:
裸板烧写 U-Boot:
- 准备烧写工具:通常需要使用专门的烧写工具,如 JTAG 调试器或者特定的烧写工具,用于将 U-Boot 程序烧写到裸板的存储器中。
- 连接烧写工具:将烧写工具与裸板连接,通常是通过 JTAG 接口或者其他特定的接口。
- 配置烧写工具:根据具体的烧写工具和裸板的硬件规格,配置相关的参数,如目标设备地址、烧写速率等。
- 烧写 U-Boot:使用烧写工具加载 U-Boot 的二进制文件,并将其烧写到裸板的存储器中。这通常涉及将二进制文件加载到适当的存储器地址,并执行相应的烧写命令。
进入 U-Boot 环境后烧写新的 U-Boot:
- 准备新的 U-Boot 二进制文件:首先,需要准备新的 U-Boot 二进制文件,该文件可能是经过编译或者配置的新版本 U-Boot。
- 连接到目标设备:通过串口、网络或其他适当的接口,将计算机连接到已经运行旧版 U-Boot 的目标设备。
- 进入 U-Boot Shell:通过串口终端等方式进入 U-Boot Shell,这样你就可以执行 U-Boot 提供的命令和功能。
- 烧写新的 U-Boot:在 U-Boot Shell 中,使用相关的烧写命令或工具加载新的 U-Boot 二进制文件,并将其写入裸板的存储器中。具体的命令和工具可能因 U-Boot 版本而异,可以参考 U-Boot 的文档或命令行帮助来执行相应的操作。
需要注意的是,烧写 U-Boot 时需要小心操作,确保正确的二进制文件被写入正确的地址,以避免意外损坏设备。同时,不同的硬件平台和 U-Boot 版本可能会有不同的操作方式和命令。因此,在操作之前,建议仔细阅读相关的文档和指南,并确保你对操作有充分的理解和准备。
linux下利用kermit烧写u-boot - Jekyll Theme