uboot的初体验——uboot的源码目录分析(附带uboot资源)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、如何获取uboot?

uboot可以有3种获取途径:uboot官方、SoC官方、具体开发板的官方。 

(1)最原始的uboot的源代码都是从uboot官网下载的。但是从uboot官网下载的uboot,可能没有你当前使用的开发板的相关移植,甚至你可能找不到当前开发板使用的SoC对应的移植版本。

uboot官方地址:网址链接

(2)SoC厂商在推出一款SoC后,也会推出一款使用这款SoC的开发板。SoC厂商的工程师会去uboot官网下载一个uboot,并根据自己的SoC和开发板进行移植。比如三星推出S5PV210这款SoC后,也推出了一款使用S5PV210这款SoC的开发板SMDKV210,并根据这款开发板对uboot进行修改与移植。

三星官方为SMDKV210开发板移植的uboot:uboot_smdkv210.tar

(3)具体的开发板供应商(比如深圳市九鼎科技公司)首先购买三星的SMDKV210开发板,然后进行裁剪(把一些无用的接口功能裁剪去,降低或者替换一些硬件配置)。裁剪之后形成新的开发板(比如深圳市九鼎科技公司推出的X210开发板)和三星官方的SMDKV210有所不同,因此uboot也不同。但是因为SoC是相同的,所以至少有60%的相似度。因此具体开发板供应商会以三星SMDKV210中移植的uboot为蓝本,来移植得到适配自己开发板的uboot。

我们购买深圳市九鼎科技公司的X210开发板时,附带光盘中的BSP(board support package,板级支持包,包含与开发板相关的源代码、文档、教程等内容)中的uboot源码,就是九鼎科技公司移植过的(位于qt_x210v3s_160307.tar.bz2中,如下图所示)。

九鼎官方为X210开发板移植的uboot:uboot_jiuding.tar

二、uboot的源码目录分析

不同版本的uboot,或者同一版本不同人员移植的uboot,目录结构和文件内容都会有所不同,因为可以根据需要去添加、删除或者更改目录结构。在以三星的 uboot 为蓝本进行移植时,九鼎科技公司删除了很多不必要的文件夹与文件。我们以九鼎移植后的uboot,来说明uboot的目录结构。

1、文件分析

重要文件有mkconfig和Makefile,一个负责uboot的配置,一个负责编译。

(1)Makefile。此文件是uboot源代码的主Makefile,用此文件来管理uboot的编译。

(2)mkconfig。此文件是uboot配置阶段的主要配置脚本,uboot的可移植性很大程度依靠这个配置脚本。

(3).gitignore。git是一个版本管理工具(类似的还有svn),这个文件和git有关,和uboot本身无关的。

(4)arm_config.mk。后缀是.mk,是一个Makefile文件,将来在某个Makefile中会去调用它。

(5)三个Changelog文件。修改记录文件,记录uboot项目的版本变迁,以及每个版本较上个版本修改的记录。正式的项目都有这些记录的。主要是给维护uboot的人用的。

(6)config.mk。和arm_config.mk性质差不多。

(7)COPYING。版权声明,uboot本身是GPL许可证的。

(8)CREDITS。鸣谢,里面记录了对uboot有贡献的人,感谢目录。

(9)image_split。一个脚本,将uboot.bin分割到BL1。

(10)MAINTAINERS。维护者,即当前在参与维护uboot源码的社区工作者。

(11)MAKEALL。一个脚本,帮助编译uboot的。

(12)mk。快速编译的脚本,其实就是先清理然后配置然后编译而已。

(13)mkmovi。一个脚本,和iNand/SD卡启动有关。

(14)README。所有的软件都有README,其实就是个简单的使用说明书。

(15)rules.mk。这个文件是uboot的Makefile的使用规则。本身非常重要,但是不用分析。


2、目录分析

重要的目录有board、common、cpu、drivers、include、lib_arm、lib_generic、sd_fusing等。

(1)api。与硬件无关的功能函数的API,是uboot本身使用的,uboot移植时基本不用管。

(2)api_examples。 API相关的测试事例代码。

(3)board。board文件夹下每一个文件都代表一个开发板,这个文件夹下面放的文件就是用来描述这一个开发板的信息的。board目录下有多少个文件夹,就表示当前的uboot支持多少个开发板。

由于开发板越来越多,board目录下文件夹越来越多而不方便管控,因此uboot新增了一种机制,在board目录下不直接放开发板目录,而是在board目录下放厂商目录(vendor目录,以具体芯片厂商名字命名),然后将这个厂商的所有芯片开发板文件夹都丢到这个vendor目录中(因此大家会发现X210开发板对应的文件夹是board/samsung/x210)。但是因为要向前兼容,早期就位于board目录下的开发板文件夹并没有被挪移到相应的厂商目录中。

(4)common。这个文件夹存放一些与具体硬件无关的、普遍适用的一些代码。譬如控制台实现、crc校验的。但是更多的主要是两类:一类是cmd开头的,是用来实现uboot的命令系统的;另一类是env开头的,是用来实现环境变量的。

(5)cpu。这个目录是SoC相关的,存放与SoC相关初始化和控制的代码(譬如CPU的、中断的、串口等SoC内部外设的,包括起始代码start.S)。里面很多子文件夹,每一个子文件夹就是一个SoC系列。这个文件和硬件严格相关,移植时也是要注意的。但是因为这个文件夹内都是SoC有关的,X210开发板和三星的开发板虽然板子设计不同,但是SoC都是同一个,因此实际移植时这个目录几乎不用动。

(6)disk。与磁盘有关。

(7)doc。文档目录,里面存放了很多uboot相关文档,这些文档可以帮助理解uboot代码。

(8)drivers。存放的是从linux源代码中拷贝过来的linux设备驱动,主要是开发板上必须用到的一些驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动。uboot中的驱动其实就是linux中的驱动,uboot在一定程度上移植了linux的驱动。

(9)examples。示例代码。

(10)fs。filesystem,文件系统。也是从linux源代码中移植过来的,用来管理Flash等资源。

(11)include。头文件目录。uboot和linux kernel在管理头文件时都采用了同一个思路,即把所有的头文件全部集中存放在include目录下,而不是头文件跟着自己对应的c文件。因此在uboot中头文件包含时路径结构要在这里去找。

(12)lib_开头的目录,典型的如lib_arm和lib_generic。这是架构相关的库文件。譬如lib_arm里面就是arm架构使用的一些库文件。lib_generic里是所有架构通用的库文件。这类文件夹中的内容移植时基本不用管。

(13)libfdt。与设备树有关。linux内核在3.4左右的版本的时候更改了启动传参的机制,改用设备树来进行启动传参,进行硬件信息的描述。

(14)nand_spl。nand相关的。

(15)net。网络相关的代码,譬如uboot中的tftp nfs ping都是在这里实现的。

(16)onenand开头的,是onenand相关的代码,是三星加的,标准uboot中应该是没有的。

(17)post。

(18)sd_fusing。烧录uboot镜像到SD卡的代码。

(19)tools。里面是一些工具类的代码。譬如mkimage。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录 u-boot-1.1.6 之 cpu/arm920t/start.s分析 ........................................................................................... 2 u-boot 中.lds连接脚本文件的分析 ...................................................................................................12 分享一篇我总结的 uboot 学习笔记(转) .....................................................................................15 U-BOOT内存布局及启动过程浅析 ...................................................................................................22 u-boot 中的命令实现 .......................................................................................................................... 25 U-BOOT环境变量实现 ........................................................................................................................28 1.相关文件 ....................................................................................................................................28 2.数据结构 ....................................................................................................................................28 3.ENV 的初始化...........................................................................................................................30 3.1env_init ............................................................................................................................30 3.2 env_relocate ...................................................................................................................30 3.3*env_relocate_spec ........................................................................................................31 4. ENV 的保存 ..............................................................................................................................31 U-Boot 环境变量 ..........................................................................................................................32 u-boot 代码链接的问题 ......................................................................................................................35 ldr 和 adr 在使用标号表达式作为操作数的区别 ............................................................................40 start_armboot 浅析 ..............................................................................................................................42 1.全局数据结构的初始化 ..........................................................................................................42 2.调用通用初始化函数...............................................................................................................43 3.初始化具体设备 .......................................................................................................................44 4.初始化环境变量 .......................................................................................................................44 5.进入主循环 ...............................................................................................................................44 u-boot 编译过程 ...................................................................................................................................44 mkconfig文件的分析 .......................................................................................................................... 47 从 NAND闪存中启动 U-BOOT的设计 ..............................................................................................50 引言 ...............................................................................................................................................50 NAND闪存工作原理 ................................................................................................................... 51 从 NAND闪存启动 U-BOOT的设计思路.................................................................................. 51 具体设计 ....................................................................................................................................... 51 支持 NAND闪存的启动程序设计 ..................................................................................... 51 支持 U-BOOT命令设计 ...................................................................................................... 52 结语 ............................................................................................................................................... 53 参考文献 ....................................................................................................................................... 53 U-boot 给 kernel 传参数和 kernel 读取参数—struct tag (以及补充) ............................................ 53 1 、u-boot 给 kernel 传 RAM 参数 ........................................................................................54 2 、Kernel 读取 U-boot 传递的相关参数 .............................................................................56 3 、关于 U-boot 中的 bd 和 gd...............................................................................................59 U-BOOT源码分析及移植 ....................................................................................................................60 一、 u-boot 工程的总体结构: ..................................................................................................61 1、源代码组织 ....................................................................................................................61 2.makefile简要分析 ............................................................................................................61 3、u-boot 的通用目录是怎么做到与平台无关的?......................................................63 4、smkd2410 其余重要的文件 : ...................................................................................63 二、u-boot 的流程、主要的数据结构、内存分配 ................................................................64 1、u-boot 的启动流程: ...................................................................................................64 2、u-boot 主要的数据结构 ...............................................................................................66 3、u-boot 重定位后的内存分布: ...................................................................................68 三、u-boot 的重要细节 。 ........................................................................................................68 关于 U-boot 中命令相关的编程 : ................................................................................. 73 四、U-boot 在 ST2410 的移植,基于 NOR FLASH和 NAND FLASH启动。......................... 76 1、从 smdk2410 到 ST2410: .............................................................................................. 76 2、移植过程: .................................................................................................................... 76 3、移植要考虑的问题: ...................................................................................................77 4、SST39VF1601: .................................................................................................................77 5、我实现的 flash.c主要部分: ...................................................................................... 78 6、增加从 Nand 启动的代码 : ..................................................................................... 82 7、添加网络命令。 ............................................................................................................ 87
### 回答1: u-boot是一个开源的引导加载程序,用于嵌入式系统的启动。它通常嵌入在芯片的ROM或闪存中,是系统的第一个执行程序,负责初始化硬件、加载操作系统和其他应用程序。 u-boot源码是以C语言编写的,具有高度可移植性。它提供了一系列的驱动程序和命令行工具,可以在开发板上进行硬件初始化和测试。 源码的结构分为几个重要的部分:启动代码、中断向量表、初始化代码以及其他功能模块。启动代码是u-boot执行的入口点,在这个阶段,它会初始化一些必要的硬件设备,例如串口、存储器等,同时也会设置中断向量表。 中断向量表是一个由硬件中断信号触发的函数指针数组,u-boot将中断信号与相应的函数关联起来,以便在发生中断时进行相应的处理。 初始化代码是u-boot执行的核心部分,它会通过配置文件或环境变量来读取系统设置,并进行相应的初始化。例如,它会加载并运行操作系统内核镜像,设置内存映射表,配置设备和网络接口等。 此外,u-boot还提供了一些功能模块,例如命令行解析器、文件系统支持、网络协议栈等。这些功能模块可以通过命令行进行操作,以便用户对嵌入式系统进行配置、调试和测试。 对于研究和分析u-boot源码,可以从以下几个方面入手: 1. 启动流程:了解u-boot是如何从ROM或闪存中加载到内存并执行的,包括启动代码和中断向量表的设置。 2. 硬件初始化:了解u-boot是如何初始化硬件设备的,包括串口、存储器、网络接口等。 3. 配置文件和环境变量:了解u-boot是如何通过配置文件或环境变量来读取系统设置的,以及如何进行相应的初始化。 4. 功能模块:了解u-boot提供的功能模块,例如命令行解析器、文件系统支持、网络协议栈等,以及它们的实现方式和使用方法。 通过对u-boot源码的详细分析,可以深入了解嵌入式系统的引导过程、硬件初始化和驱动程序的编写,从而提高嵌入式系统的开发和调试能力。 ### 回答2: Uboot是一种开源的引导加载程序,用于嵌入式系统的启动。它是一个简单而灵活的软件,可以在各种硬件平台上使用,并提供了许多功能和驱动程序。 首先,Uboot的主要功能是加载和运行操作系统。它通过读取存储介质上的引导扇区,将操作系统加载到内存中并启动。此外,Uboot还提供了命令行界面,用户可以在启动过程中进行配置和控制。 Uboot的源代码由若干模块组成,包括引导代码、设备驱动程序、命令行解析器等。其中,引导代码是最关键的部分,负责在硬件启动时初始化系统和设备,并在引导过程中进行加载和启动操作系统。设备驱动程序用于访问硬件设备,例如存储介质、串口等。命令行解析器则负责解析用户输入的命令,并执行相应的操作。 在Uboot的源代码中,可以找到各种初始化和设置函数,以及与硬件平台相关的代码。这些代码通常是与硬件设备的寄存器交互,进行硬件初始化和配置。此外,还有一些与引导过程和加载操作系统相关的代码,用于读取、解析和加载引导扇区以及操作系统镜像。 总的来说,Uboot源码详细分析涉及到引导代码、设备驱动程序和命令行解析器等多个模块。在分析过程中,需要理解硬件平台的相关知识和操作系统的启动流程,并深入了解Uboot的代码实现和功能。只有这样,才能对Uboot源码有一个全面的理解,并能根据需求进行相应的修改和定制。 ### 回答3: U-Boot是一款开源的引导加载程序,用于嵌入式系统中启动操作系统。它是最常用的引导加载程序之一,具有广泛的应用。下面,我将对U-Boot源码进行详细分析。 U-Boot源码位于一个git仓库中,可以通过clone仓库获取源码源码的结构清晰,主要分为三个部分:板级支持包(board support package,BSP),引导和命令。 BSP包含了与硬件相关的代码和配置文件,用于支持不同的硬件平台。其中,包括设备初始化、设备驱动程序和硬件设置等。这些代码主要包括处理器启动代码、时钟初始化、内存初始化以及设备和外设的配置等。 引导部分是U-Boot的核心,其中包括引导过程的各个阶段。首先,它加载引导扇区和主引导程序,其中包括引导加载器。引导加载器根据设备的启动模式选择适当的引导方式。然后,它会加载内核映像和根文件系统,并将控制权转移到内核。 最后,命令部分包含了一系列的命令,用于与用户进行交互。这些命令可以用于启动操作系统、进行系统设置和调试等。U-Boot提供了丰富的命令集,包括boot、setenv、saveenv、printenv等等。 在分析U-Boot源码时,需要了解硬件平台的特性和配置文件。可以根据目标硬件平台的手册和数据手册,对源码进行逐步分析和调试。在分析过程中,可以使用调试工具进行跟踪、断点和单步调试,以便更好地理解源码的执行过程。 总的来说,U-Boot源码的详细分析需要涉及到硬件平台的特性和配置文件,并对引导加载过程和命令解析进行深入研究。通过对U-Boot源码的理解和分析,可以为嵌入式系统的启动和操作提供更好的支持和定制化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天糊土

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

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

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

打赏作者

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

抵扣说明:

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

余额充值