05_Uboot源码目录分析

目录

Uboot 源码目录分析

arch 文件夹

board 文件夹

configs 文件夹

.u-boot.xxx_cmd 文件

Makefile 文件

u-boot.xxx文件

.config文件

README

Uboot 源码目录分析

学会uboot使用以后就可以尝试移uboot到自己的开发板上了,但是在移植之前需要我们得先分析一遍uboot的启动流程源码,得捋一下uboot的启动流程,否则移植的时候都不知道该修改那些文件。本章我们就来分析一下uboot源码,重点是分析uboot启动流程,而不是整个 uboot源码,uboot整个源码非常大,我们只看跟我们关心的部分即可。

因为uboot会使用到一些经过编译才会生成的文件,因此我们在分析uboot的时候需要先编译一下uboot未编译的uboot如图所示:

 编译后的uboot文件夹内容

对比图,可以看出编译后的uboot要比没编译之前多了好多文件,这些文件夹或文件的含义见表所示:

 

 

 

arch 文件夹

这个文件夹里面存放着和架构有关的文件,如图所示:

 从图可以看出有很多架构,比如arm, avr32, m68k等,我们现在用的是ARM芯片,所以只需要关心arm文件夹即可,打开arm文件夹里面内容如图所示:

 mach开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的exyons系列 CPU有关的文件。我们使用的是 I.MX6ULL,所以要关注“imx-common”这个文件夹。另外“cpu”这个文件夹也是和cpu架构有关的,打开以后如图所示:

从图可以看出有多种ARM架构相关的文件夹, I.MX6ULL使用的Cortex-A7内核,Cortex-A7 属于armv7,所以我们要关心“armv7”这个文件夹。cpu文件夹里面有个名为“uboot.Ids”的链接脚本文件,这个就是ARM芯片所使用的u-boot链接脚本文件!armv7 这个文件夹里面的文件都是跟ARMV7架构有关的,是我们分析uboot启动源码的时候需要重点关注的。 

 

board 文件夹

board文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面,borad文件夹里面有个名为"freescale”的文件夹,如图所示:

所有使用freescale芯片的板子都放到此文件夹中, IMX系列以前属干freescale,只是"freescale后来被NXP收购了。打开此freescale文件夹,在里面找到和mx6u(I.MX6UL/ULL)有关的文件来,如图所示:  

 图mx6ul相关板子图中有5个文件夹,这5个文件夹对应5种板子,以“mx6ul”开头的表示使用I.MX6UL芯片的板子,以mx6ull开头的表示使用I.MX6ULL芯片的板子。mx6ullevk是NXP官方的I.MX6ULL开发板,正点原子的ALPHA开发板就是在这个基础上开发的,因此mx6ullevk也是正点原子的开发板。我们后面移植uboot到时候就是参考NXP官方的开发板,也就是要参考mx6ullevk这个文件夹来定义我们的板子。

configs 文件夹

此文件夹为uboot配置文件,uboot是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的基配置文件统一命名为“xxx_defconfig”,xxx 表示开发板名字,这些defconfig文件都存放在 configs文件夹,因此, NXP官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中,如图所示:

 

图中这6个文件就是正点原子I.MX6U-ALPHA开发板所对应的uboot默认配置文件。我们只关心mx6ull 14x14 ddr512 emmc defconfig和mx6ull 14x14 ddr256 nand defconfig这两个文件,分别是正点原子IMX6ULL EMMC核心板和NAND核心板的配置文件。使用“make xxx_defconfig”命令即可配置uboot,比如:

make mxбull_14x14_ddr512_emme_defconfig

上述命令就是配置正点原子的I.MX6ULL EMMC核心板所使用的uboot

在编译uboot之前一定要使用defconfig来配置uboot!

在mx6ull_alientek_emme.sh中就有下面这一句:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_

defconfig

 

 这个就是调用mx6ull_14x14_ddr512_emme_defconfig来配置uboot,只是这个命令还带了一些其它参数而已。

.u-boot.xxx_cmd 文件

.u-boot.xxx_cmd是一系列的文件,这些文件都是编译生成的,都是一些命令文件,比如文件u-boot bincmd看名字应该是和ubootbin有关的,此文件的内容: 

u-boot.bin.cmd里面定义了一个变量: cmd u-boot.bin,此变量的值为“cp u-boot-nodtb.bin" u-boot.bin,也就是拷贝一份u-boot-nodtb.bin文件,并且重命名为u-boot.bin,这个就是 u-boot.bin的来源,来自文件u_boot-nodtb.bin 

那么u-boot-nodtb.bin是怎么来的呢?文件.u-boot-nodtb.bin.cmd就是用于生成uboot.nodtb.bin的,此文件内容如下:

这里用到了arm-linux-gnueabihf-objcopy,使用objcopy将ELF格式的u-boot文件转换为二进制的u-boot-nodtb.bin文件。 

文件u-boot是ELF格式的文件,文件u-boot.cmd用于生成u-boot,文件内容如下:

 .u-boot.cmd使用到了arm-linux-gnueabihf-ld.bfd,也就是链接工具,使用Id.bfd将各个 builtin.o文件链接在一起就形成了u-boot 文件。uboot 在编译的时候会将同一个目录中的所有.c文件都编译在一起,并命名为 built-in.o,相当于将众多的.c文件对应的.o文件集合在一起,这个就是u-boot文件的来源。

如果我们要用NXP提供的MFGTools工具向开发板烧写uboot,此时烧写的是u-boot.imx文件,而不是u-boot.bin文件。u-boot.imx是在u-boot.bin文件的头部添加了IVT,DCD等信息。这个工作是由文件u-boot.imx.cmd完成的,此文件内容加下: 

 

可以看出,这里用到了工具tools/mkimage,而IVT、DCD等数据保存在了文件board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp中(如果是NAND核心板的话就是imximage-ddr256.cfg.cfgtmp),工具mkimage就是读取文件imximage-ddr512.cfg.cfgtmp里面的信息,然后将其添加到文件u-boot.bin的头部,最终生成u-boot.imx。

文件.u-boot.lds.cmd就是用于生成u-boot.lds链接脚本的,由于.u-bootlds.cmd文件内容太多,这里就不列出来了。uboot根目录下的u-boot.lds链接脚本就是来源于arch/arm/cpu/u-boot.lds文件

 

Makefile 文件

这个是顶层Makefile文件,Makefile是支持嵌套的,也就是顶层Makefile可以调用子目录中的Makefile文件。Makefile嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放"到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile,这个Makefile只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个Makefile中,可以使得Makefile变得简洁明了。

uboot源码根目录下的Makefile是顶层Makefile,他会调用其它的模块的Makefile文件,比如drivers/adc/Makefile。当然了,顶层Makefile要做的工作可远不止调用子目录Makefile这么简单,关于顶层Makefile的内容我们稍后会有详细的讲解。

u-boot.xxx文件

u-boot.xxx同样也是一系列文件,包括u-boot、u-boot.bin、u-boot.cfg、u-boot.imx、u-boot.lds、u-boot.map、u-boot.srec、u-boot.sym和u-boot-nodtb.bin,这些文件的含义如下:

u-boot:编译出来的ELF格式的uboot镜像文件。

u-boot.bin:编译出来的二进制格式的uboot可执行镜像文件。

u-boot.cfg: uboot的另外一种配置文件。

u-boot.imx: u-boot.bin添加头部信息以后的文件,NXP的CPU专用文件。

u-boot.lds:链接脚本。

u-boot.map: uboot映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。

u-boot.srec:S-Record格式的镜像文件。

u-boot.sym: uboot符号文件。

u-boot-nodtb.bin:和u-boot.bin一样,u-boot.bin就是u-boot-nodtb.bin的复制文件

 

 

.config文件

uboot配置文件,使用命令"make xxx_defconfig”配置 uboot 以后就会自动生成,.config内容如下:

 可以看出.config文件中都是以“CONFIG_”开始的配置项,这些配置项就是Makefile中的变量,因此后面都跟有相应的值,uboot的顶层Makefile或Makefile会调用这些变量值。在.config中会有大量的变量值为'y',这些为'y'的变量一般用于控制某项功能是否使能,为‘y’的话就表示功能使能,比如:

CONFIG_CMD_BOOTM=y 

如果使能了bootd这个命令的话, CONFIG_CMD_BOOTM就为'y'。在cmd/Makefile中有如下代码: 

 在示例代码中,有如下所示一行代码:

obj-$(CONFIG CMD BOOTM)+= bootm.o 

CONFIG CMD BOOTM=y,将其展开就是: 

obj-y += bootm.o 

也就是给obj-y追加了一个“bootm.o”,obj-y包含着所有要编译的文件对应的.o文件,这里表示需要编译文件cmd/bootm.c。相当于通过“CONFIG_CMD_BOOTD-y”来使能bootm这个命令,进而编译cmd/bootm.c这个文件,这个文件实现了命令bootm。在uboot和Linux内核中都是采用这种方法来选择使能某个功能,编译对应的源码文件。 

 

 

README

README文件描述了uboot的详细信息,包括uboot该如何编译、uboot中各文件夹的含义、相应的命令等等。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值