1. U-Boot简介
Linux系统要启动就必须需要一个bootloader程序,也就是说芯片上电后先运行一段bootloader程序,这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND/NOR FLASH/SD/MMC等)拷贝到DDR中,最后启动Linux内核。bootloader和Linux内核的关系跟PC上的BIOS和Windows的关系一样,bootloader就相当于BIOS。目前有很多现成的bootloader软件可用,比如U-Boot、vivi、RedBoot等,其中以U-Boot使用最为广泛,接下来将主要介绍U-Boot(uboot)
uboot(Universal Boot Loader),是一个遵循GPL协议的开源软件,是一个裸机代码,可以看作是一个裸机综合例程。uboot官网为 http://www.denx.de/wiki/oops/U-Boot/ 或者 (ftp://ftp.denx.de/pub/u-boot/) ,可在“Source Code”中下载uboot源码
uboot官网上下载的是原汁原味的uboot源码,但是一般不会直接使用uboot官方源码。uboot官方源码是给半导体厂商准备的;半导体厂商会下载官方uboot源码,然后将自家相应的芯片移植进去,也就是说半导体厂商会自已维护一个版本的uboot,例如IMX6U芯片厂商NXP就会维护一个自已的uboot版本;芯片厂商维护的uboot版本主要针对自家评估板的,如果自已做的开发板就需要修改芯片厂商官方的uboot,使其支持开发板厂商生产的评估板
这里使用开发板厂商提供的uboot源码( uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2)来对uboot工程目录进行分析
以EMMC版的核心板为例,以下是uboot的目录,左侧为未编译的源码,右侧为编译后的源码(编译方法见本文第二小节)
编译后的uboot源码比未编译的源码多了许多文件,这些文件或文件夹的含义见下表:
上表中很多文件夹和文件我们都不需要去关心,需要关注的文件夹或文件如下:
- arch文件夹:存放与架构有关的文件,这里只关注arm文件夹即可
打开arch/arm文件夹,里面内容(部分)如下:
– mach开头的文件夹跟具体的设备有关,我们使用的IMX6U,需要关注“imx-common”
– cpu文件夹里是和cpu架构有关的
打开arm/cpu文件夹,里面内容如下:
– armv7文件夹,IMX6U是Cortex-A7内核属于armv7,因此需要关注armv7文件夹
– u-boot.lds是ARM芯片所使用的u-boot链接脚本文件
- board文件夹:和具体的板子有关的
打开board文件夹,里面内容如下:
– freescale文件夹,freescale芯片的板子都在此文件夹下
打开freescale文件夹,找到和mx6u相关的文件夹:
– mx6ul开头的,表示使用IMX6UL芯片的板子
– mx6ull开头的,表示使用IMX6ULL芯片的板子
– mx6ullevk是NCP官方的IMX6ULL开发板
- configs文件夹:存放uboot配置文件,一般半导体或开发板厂商会制作好一个配置文件,供用户在此基础上进行修改,配置文件统一命名为“xxx_defconfig”,xxx表示开发板名字
打开configs文件夹,里面的配置文件如下
– 下图框中的6个文件就是ALPHA开发板对应的uboot默认配置文件
使用"make xxx_defconfig"命令,即可配置uboot
- u-boot.xxx_cmd文件:是一系列的文件,都是编译生成的,是一些命令文件
比如.u-boot.bin.cmd文件,里面存放了一个变量cmd_u-boot.bin
#该变量的作用:拷贝一份u-boot-nodtb.bin文件,并重命名为u-boot.bin
cmd_u-boot.bin := cp u-boot-nodtb.bin u-boot.bin
那么u-boot-nodtb.bin是怎么来的呢?.u-boot-nodtb.bin.cmd就是用于生成u-boot-nodtb.bin的
#用到了arm-linux-gnueabihf-objcopy来将ELF格式的u-boot文件转换为二进制的u-boot-nodtb.bin
cmd_u-boot-nodtb.bin := arm-linux-gnueabihf-objcopy --gap-fill=0xff -j .text......-O binary u-boot u-boot-nodtb.bin
文件u-boot是ELF格式的文件,.u-boot.cmd就是用于生成u-boot的
#用到了arm-linux-gnueabihf-ld.bfd链接工具,将各个built-in.o文件链接在一起形成u-boot文件
cmd_u-boot := arm-linux-gnueabihf-ld.bfd ......