本帖最后由 xcoder 于 2016-3-19 20:35 编辑
实战2 编译u-boot镜像
前文介绍了pcDuino启动过程中需要的几个镜像,对于boot阶段,boot0已经有厂商固化,因此需要开发人员只需提供SPL和u-boot,下面介绍二者编译过程。
图2.1 pcDuino启动过程 2.1 下载u-boot源代码
使用git工具命令clone一份u-boot源码,clone下来的u-boot源码位于目录/home/ubuntu/pcduino/u-boot-sunxi内。
- # cd /home/ubuntu/pcduino
- # git clone https://github.com/linux-sunxi/u-boot-sunxi.git
复制代码
2.2配置目标板
- # cd /home/ubuntu/pcduino/u-boot-sunxi
- # make CROSS_COMPILE=arm-linux-gnueabihf- Linksprite_pcDuino3_config O=build
复制代码u-boot支持上千个目标板,因此在编译u-boot之前要选择并配置我们关注的目标板,这些目标板的描述记录在u-boot源码根目录下文件boards.cfg中,如图2.2所示。
图2.2 u-boot支持的目标板
每一个目标板使用单独一行进行描述,行首的#号起到注释作用;每一行包含9个字段,字段间使用一个或多个空白符(空格或TAB)分隔这些字段含义如下表: 表2.1 u-boot配置文件字段描述 Status | Arch | CPU:SPLCPU | SoC | Vendor | Board name | Target | Options | Maintainers | 状态,标明当前配置是否有效 | 处理器所属架构 | 处理器核类型 | SoC类型 | 生厂商 | 电路板名称 | 编译目标 | 附属选项 | 维护人员信息 |
其中Options字段格式为: <board config name>[: options] 每个选项的格式为(默认值为1): option[=value] 假设Options字段定义如下: FOO:HAS_BAR,BAZ=64 那么,目标板配置脚本会创建头文件include/config.h同时,会在这个文件定义如下宏: - #define CONFIG_HAS_BAR 1
- #define CONFIG_BAZ 64
复制代码由于我们使用的Linksprite_pcDuino3配置: - Active arm armv7 sunxi - sunxi Linksprite_pcDuino3 sun7i: LINKSPRITE_PCDUINO3,SPL,SUNXI_GMAC,FAST_MBUS -
复制代码
Options字段定义: sun7iINKSPRITE_PCDUINO3,SPL,SUNXI_GMAC,FAST_MBUS 则会生成文件include/config.h,文件中定义如下一组宏: - #define LINKSPRITE_PCDUINO3 1
- #define SPL 1
- #define SUNXI_GMAC 1
- #define FAST_MBUS 1
复制代码
对于不被使用的字段使用“-”填充。 u-boot支持不同的架构处理器,每款处理器有自己一套指令集,运行在处理器上的程序必须使用该处理器支持的指令集,交叉编译器能够将源码编译成应处理支持的二进制机器码,在编译u-boot时,使用变量CROSS_COMPILE指定交叉编译器,这个变量在Makefile文件中使用。
图2.3 工具链配置 第327行,CC变量由CROSS_COMPILE和gcc组成,即CC=arm-linux-gnueabihf-gcc,因此凡是引用$(CC)的地方实际上是在使用arm-linux-gnueabihf-gcc。 默认情况下,编译生成的目标文件与源码混在一起,使用O=build参数可将编译生成的目标文件单独放在build目录下,从而使得源代码“干净”。 执行配置目标板命令后,在build目录下生成一些目录和文件
图2.4 配置目标板生成文件或目录 简要介绍一下这些文件: build/Makefile:Makefile文件,描述了个源文件/模块编译的依赖关系 build/include/asm/arch:软连接文件,连接到具体架构头文件目录 build/include/asm/proc:软连接文件,连接到具体架构头文件目录 build/include/config.h:顶级配置文件,内容是根据boards.cfg配置自动生成,包含了板级、处理器和SoC等宏定义,此外还有一些通用的头文件。 build/include/config.mk:定义一些变量,在根目录Makefile中被引用 build/source:软连接文件,指向u-boot源码目录
2.3编译u-boot
执行如下命令: - # make CROSS_COMPILE=arm-linux-gnueabihf- O=build
复制代码经过一些列的编译过程,最终生成几个重要目标文件, build/u-boot: ELF(Executable and Linking Format)格式文件,除了包含所有的可执行的代码段数据段等,还包含了一些调试信息。使用命令arm-linux-gnueabihf-readelf可以查看文件一些具体信息。如查看ELF文件头内容:
图2.5 u-boot文件格式 build/u-boot.bin: 使用arm-linux-gnueabihf-objcopy工具,将ELF格式的u-boot文件去除所有调试信息,只保留可执行的二进制机器码。 build/u-boot.img: 该文件由64字节头和u-boot.bin文件组成。使用工具build/tools/mkimage: 可以实现增加头信息操作。头信息用于描述镜像的名称、类型、加载地址、执行入口地址等。 build/spl/u-boot-spl: 前文提到的SPL镜像文件, 也是ELF格式。
build/spl/u-boot-spl.bin:由u-boot-spl文件转换得到,纯BIN格式文件。
图2.6 u-boot各镜像文件生成过程 查看build/u-boot.bin和build/spl/u-boot-spl.bin这两BIN文件大小,可以看到u-boot-spl.bin明显小于u-boot.bin,这印证了前文所述的SPL是精简过的u-boot。
- #ls -l build/u-boot.bin build/spl/u-boot-spl.bin
- -rwxrwxr-x 1 ubuntu ubuntu 20277 7月 25 18:29 build/spl/u-boot-spl.bin
- -rw-rw-r-- 1 ubuntu ubuntu 237204 7月 25 18:29 build/u-boot.bin
复制代码
|