Linux内核学习(三):Bootloader的特种兵-Uboot(一)

本文详细介绍了U-Boot,一个通用的Bootloader,它的起源、功能、支持的操作系统和CPU架构。U-Boot具有开放源码、高可靠性和灵活性,并提供了丰富的设备驱动。文章还探讨了U-Boot的源码结构,分为平台相关、通用函数、设备驱动和工具等四类。此外,解释了配置、编译和连接过程,包括make命令的作用和配置文件的生成。最后,概述了U-Boot的编译流程,强调了如何通过宏开关控制代码编译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux内核学习(三):Bootloader的特种兵-Uboot(一)

内容全部来自–>《嵌入式应用开发完全手册》

1、什么是U-Boot

U-Boot,全称为Universal Boot Loader,即通用Bootloader,是遵循GPL条款的开放源代码项目。

其前身是由德国DENX软件工程中心的Wolfgang Denk基于8xxROM的源码创建的 PPCBOOT 工程。后来整理代码结构使得非常容易增加其他类型的开发板、其他架构的CPU(原来只支持PowerPC);增加更多的功能,比如启动Linux、下载S-Record格式的文件、通过网络启动、通过PCMCIA/CompactFLash/ATA disk/SCSI等方式启动。增加ARM架构CPU 及其他更多CPU的支持后,改名为U-Boot。

它的名字“通用”有两层含义:可以引导多种操作系统、支持多种架构的CPU。

  • 支持如下操作系统:Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等
  • 支持如下架构的CPU:PowerPC、MIPS、 x86、ARM、NIOS、xScale等。

U-Boot有如下特性。

  • 开放源码。
  • ·支持多种嵌入式操作系统内核,如Linux.NetBSD. VxWorks.QNX.RTEMS、ARTOS.LynxOs.
  • 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、xScale。·较高的可靠性和稳定性。
  • 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等。丰富的设备驱动源码,如串口、以太网、SDRAM、Flash、LCD、NVRAM、EEPROM、RTC、键盘等。
  • 较为丰富的开发调试文档与强大的网络技术支持。
  • 支持NFS挂戟、RAMDISK(压缩或非压缩)形式的根文件系统。·支持NFS挂载、从Flash中引导压缩或非压缩系统内核。
  • 可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲。
  • 支持目标板环境变量多种存储方式,如Flash、NVRAM、EEPROM… CRC32校验,可校验Flash 中内核、RAMDISK镜像文件是否完好。
  • 上电自检功能: SDRAM、Flash 大小自动检测,SDRAM故障检测,CPU型号.·特殊功能:XIP内核引导。

可以从http://sourceforge.net/projects/U-Boot 获得U-Boot的最新版本,如果使用过程中碰到问题或是发现Bug,可以通过邮件列表网站 http://lists.sourcef orge.net/ lists/ listinfo/U-Boot-users/获得帮助。

2、U-Boot源码结构

从sourceforge网站下载U-Boot-1.1.6.tar.bz2后解压即得到全部源码,U-Boot 源码目录结构比较简单。
U-Boot-1.1.6根目录下共有26个子目录,可以分为4类。

  • (1) 平台相关的或开发板相关的。
  • (2)通用的函数。
  • ( 3)通用的设备驱动程序。
  • (4)U-Boot工具、示例程序、文档。

在这里插入图片描述
在这里插入图片描述
U-Boot 中各目录间也是有层次结构的,虽然这种分法不是绝对的,但是在移植过程中可以提供一些指导意义,如图所示。
在这里插入图片描述
比如common/cmd_nand.c文件提供了操作NAND Flash 的各种命令,这些命令通过调用drivers/nand/nand_base.c中的擦除、读写函数来实现。

这些函数针对NAND Flash 的共性作了一些封装,将平台/开发板相关的代码用宏或外部函数来代替。

而这些宏与外部函数,如果与平台相关,就要在下一层次的cpu/xxx(xxx 表示某型号的CPU)中实现;如果与开发板相关,就要在下一层次的 board/xxx目录(xxx表示某款开发板)中实现。

以增加烧写yaffs 文件系统映象的功能为例,即在 common目录下的cmd_nand.c中增加命令。比如nand write.yaffs,这个命令要调用drivers/nand/nand_util.c中的相应函数,针对yaffs文件系统的特点依次调用擦除、烧写函数。而这些函数依赖于drivers/nand/nand_base.c、cpu/arm920t/s3c24x0/nand_flash.c 文件中的相关函数。

目前U-Boot-1.1.6支持10种架构,根目录下有10个类似lib_i386的目录; 31个型号(类型)的CPU,cpu目录下有31个子目录;214种开发板,board目录下有214个子目录,很容易从中找到与自己的板子相似的配置,在上面稍作修改即可使用。

3、U-Boot 的配置、编译、连接过程

3.1 、U-Boot初体验

U-Boot-1.1.6中有几千个文件,要想了解对于某款开发板,使用哪些文件、哪个文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的 Makefile。

根据顶层Readme文件的说明,可以知道如果要使用开发板board/<board_name>,就先执行“make board_name>_config”命令进行配置,然后执行“make all",就可以生成如下3个文件。

  • U-Boot.bin:二进制可执行文件,它就是可以直接烧入ROM、NOR Flash的文件。
  • U-Boot: ELF格式的可执行文件。
  • U-Boot.srec: Motorola S-Record格式的可执行文件。

对于S3C2410的开发板,执行“make smdk2410_config "、"make all”后生成的U-Boot.bin可以烧入NOR Flash中运行。启动后可以看到串口输出些信息后进入控制界面,等待用户的输入。

对于S3C2440的开发板,烧入上面生成的U-Boot.bin,串口无输出,需要修改代码。在修改代码之前,先看看上面两个命令“make smdk2410_config”、“make all”做了什么事情,以了解程序的流程,知道要修改哪些文件。

**另外,编译U-Boot成功后,还会在它的 tools子目录下生成一些工具,比如 mkimage等。**将它们复制到/usr/local/bin目录下,以后就可以直接使用它们了,比如编译内核时,会使用mkimage 来生成U-Boot格式的内核映象文件uImage。(内核镜像生成的过程中也有用到这个工具,认真看那个图)

3.2、U-Boot 的配置过程

在这里插入图片描述
假定在U-Boot-1.1.6的根目录下编译,则其中的MKCONFIG就是根目录下的mkconfig文件.$(@:_config)的结果就是将“smdk2410_config"中的”_config”去掉,结果为“ smdk2410"。所以“make smdk2410_config”实际上就是执行如下命令:
在这里插入图片描述
到这里我们来看看这个mkconfig

(1)确定开发板名称BOARD_NAME,相关代码如下:

在这里插入图片描述

(2)创建到平台/开发板相关的头文件的链接。

略过mkconfig 文件中的一些没有起作用的行,如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)创建顶层Makefile 包含的文件includelconfig.mk,如下所示:

在这里插入图片描述
在这里插入图片描述
对于“./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0”命令,上面几行代码创建的config.mk 文件内容如下:
在这里插入图片描述

( 4)创建开发板相关的头文件include/config.h,如下所示:

在这里插入图片描述
在这里插入图片描述
现在总结一下,配置命令“make smdk2410_config”,实际的作用就是执行“./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0”命令。假设执行“./mkconfig $1 $2 $3 $4 $5$6”命令,则将产生如下结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置文件中有以下两类宏。
在这里插入图片描述
在这里插入图片描述
从下面的编译、连接过程可知,U-Boot中儿乎每个文件都被编译和连接,但是这些文件是否包含有效的代码,则由宏开关来设置。比如对于网卡驱动drivers/cs8900.c,它的格式为:
在这里插入图片描述
可以这样认为,“CONFIG_”除了设置一些参数外,主要用来设置U-Boot的功能、选择使用文件中的哪一部分;而“CFG_”用来设置更细节的参数。

(到这里我不知道你是什么样的感受,但是对于我来说,我其实第一次是有点开始懵懵,就是那种感觉学到了,懂点了,但是又把整个脉络整个不清楚的感觉,但是这是因为到这里的时候又把前面的东西搞忘了,所以多多重复,在看这个部分能联想起之前的部分,就会好很多。)

3. U-Boot的编译、连接过程

配置完后,执行“make all”即可编译,从Makefile中可以了解U-Boot使用了哪些文件、哪个文件首先执行、可执行文件占用内存的情况。
先确定用到哪些文件,下面所示为Makefile 中与ARM相关的部分。

在这里插入图片描述

第117、164行用于包含其他的config.mk文件,第117行所要包含文件的就是在上面的配置过程中制作出来的include/config.mk 文件,其中定义了ARCH、CPU、BOARD、SOC等4个变量的值为arm、arm920t、smdk2410、s3c24x0。

第164行包含顶层目录的config.mk 文件,它根据上面4个变量的值确定了编译器、编译选项等。其中对我们理解编译过程有帮助的是BOARDDIR、LDFLAGS 的值,如下所示:

在这里插入图片描述
在这里插入图片描述
继续看看makefile
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于整个分析这还是沧海一粟,大家拉着源码自己在VScode上看,然后边学习韦神的书,效果会更好点。

现在总结一些U-Boot的编译流程:
在这里插入图片描述

内容太干了,喝点水哦!!!

下一篇接着跟着韦神看看这个Uboot启动的源码是什么样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TrustZone_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值