由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同
uboot是对CPU架构和OS类型支持得比较多的一种开源引导程序
芯片最实是从iROM启动,叫BL0
iROM选择启动的下一阶段引导程序BL1
为什么BL1不直接加载到DDR
SRAM比DDR更快
DDR需要初始化,而SRAM不需要
引导传参
所传数据结构必须约定一至
引导程序与内核之间必须约定一个参数存放的地址DDR Base+0x100
数据格式约定一至
比如用户传给内核的参数:
uboot分为很多种:
Bootloader | Monitor | 描述 | X86 | ARM |
LILO | 否 | Linux磁盘引导程序 | 是 | 否 |
GRUB | 否 | GNU的LILO替代程序 | 是 | 否 |
ntldr | 否 | x86上引导windowsNT系列 | 是 | 否 |
armboot | 是 | 专门为arm架构设计的boot | 否 | 是 |
ppcboot | 是 | 引导ppc架构操作系统 | 否 | 是 |
vivi | 是 | 韩国Mizi公司针对三星ARM架构CPU设计 引导程序 | 否 | 是 |
redboot | 是 | 基于eCos的引导程序 | 是 | 是 |
u-boot | 是 | 通用引导程序,支持多种CPU架构、多种 操作系统 | 是 | 是 |
uboot目录结构
友善之臂uboot编译:
git clone https://github.com/friendlyarm/u-boot.git cd u-boot git checkout nanopi2-v2016.01 make s5p6818_nanopi3_config make CROSS_COMPILE=aarch64-linux- // make CROSS_COMPILE=aarch64-linux- V=1(打印编译显示)
编译中的问题解决:
1.openssl/ssl.h这里是库文件缺失,执行命令
$ sudo apt-get install libssl-dev
2./bin/sh: 1:dtc:not found 缺dtc工具,执行命令
$ sudo apt-get install device-tree-compiler
3.dtc: invalidoption – ‘i’ 这里是dtc工具有问题,执行以下命令
$sudo wget -c
https://raw.github.com/RobertCNelson/tools/master/pkgs/dtc.sh
$ sudo chmod 777 dtc.sh
$ ./dtc.sh
编译成功截图:
配置编译原理分析:
用户执行make s5p6818_nanopi3_config,其实是调用了一个conf bin文件去配置:
make -f ./scripts/Makefile.build obj=scripts/kconfig s5p6818_nanopi3_config
scripts/kconfig/Makefile
scripts/kconfig/conf --defconfig=arch/../configs/s5p6818_nanopi3_defconfig Kconfig
把配置写入了configs/s5p6818_nanopi3_defconfig ?
会生成include/config.h 文件
/* Automatically generated - do not edit */
#define CONFIG_BOARDDIR board/s5p6818/nanopi3
#include
#include
#include
#include
#include
configs/s5p6818_nanopi3.h中裁剪配置宏均以CONFIG_开头
这个会被解析到 include/autoconf.mk文件中
include/autoconf.mk最后又会被Makefile包含决定哪些需要编译
链接脚本:arch/arm/cpu/armv8/u-boot.lds
make CROSS_COMPILE=aarch64-linux- V=1 可以看到链接过程
aarch64-linux-ld.bfd -pie --gc-sections -Bstatic -Ttext 0x43C00000 -o u-boot -T u-boot.lds arch/arm/cpu/armv8/start.o .........
aarch64-linux-objcopy --gap-fill=0xff -j .text -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .dtb.init.rodata -O binary u-boot u-boot.bin
tools/fip_create/fip_create --dump --bl33 u-boot.bin fip-nonsecure.bin
tools/nexell/SECURE_BINGEN -c S5P6818 -t 3rdboot -l 0x7df00000 -e 0x00000000 -n tools/nexell/nsih/nanopi3.txt -i fip-nonsecure.bin -o fip-nonsecure.img
static int helloworld(cmd_tbl_t *cmdtp, int flag, int argc,char * const a
rgv[])
{
int i;
for(i=0;i