OK6410A 开发板 (三) 3 u-boot-2021.01 boot 解析概览

// 需要分析的一套过程
1.配置文件分析
2.配置过程分析
3.编译过程分析
4.链接过程分析
5.生成文件分析
6.镜像加载分析
7.镜像运行分析
u-boot-2021.01 配置出来了 两个镜像,spl(output/spl/u-boot-spl.bin)和u-boot(output/u-boot.bin)
所以有两套过程需要分析
两套板子 宏观角度上 共享同一个 配置文件,同一个配置过程,同一个编译过程,同一链接过程
但是可以 从微观角度 将  配置过程,编译过程,链接过程  分别分为两个

SPL

  • 1.配置文件分析
ok6410a_mini_defconfig 中的配置中
CONFIG_SPL 开头的配置 是 SPL的配置
同时 
CONFIG_ARM=y
CONFIG_ARCH_S3C64XX=y
CONFIG_TARGET_OK6410A=y
也是SPL的配置
  • 2.配置过程分析
同 linux 配置过程
  • 3.编译过程分析
宏观来看,和 u-boot 的编译过程在一起
微观来看,是先将 u-boot 编译链接完,然后再编译链接spl
  • 4.链接过程分析
在 output目录运行如下
1. 生成 output/spl/u-boot-spl.lds 
arm-linux-gnueabi-gcc -E -Wp,-MD,spl/.u-boot-spl.lds.d -D__KERNEL__ -D__UBOOT__  -DCONFIG_SPL_BUILD  -D__ARM__ -marm -mno-thumb-interwork  -mabi=aapcs-linux  -ffunction-sections -fdata-sections -fno-common -ffixed-r9  -msoft-float    -pipe -march=armv5t -D__LINUX_ARM_ARCH__=6  -I../arch/arm/mach-s3c64xx/include -Ispl/include -Iinclude  -I../include  -I../arch/arm/include -include ../include/linux/kconfig.h  -nostdinc -isystem /home/suws/ok6410/system-new/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabi/7.4.1/include -include ../include/u-boot/u-boot.lds.h -include ./include/config.h -DCPUDIR=arch/arm/cpu/arm1176  -DIMAGE_TEXT_BASE=0x0C000000 -ansi -D__ASSEMBLY__ -x assembler-with-cpp -std=c99 -P -o spl/u-boot-spl.lds ../board/samsung/ok6410a/u-boot-spl.lds
2.链接 生成 output/spl/u-boot-spl
(cd spl && arm-linux-gnueabi-ld.bfd  -T u-boot-spl.lds  --gc-sections -Bstatic --gc-sections  --no-dynamic-linker -Ttext 0x0C000000 arch/arm/cpu/arm1176/start.o --start-group arch/arm/mach-s3c64xx/built-in.o arch/arm/cpu/arm1176/built-in.o arch/arm/cpu/built-in.o arch/arm/lib/built-in.o board/samsung/ok6410a/built-in.o board/samsung/common/built-in.o common/spl/built-in.o common/init/built-in.o lib/built-in.o disk/built-in.o drivers/built-in.o dts/built-in.o fs/built-in.o  --end-group arch/arm/lib/eabi_compat.o arch/arm/lib/lib.a -Map u-boot-spl.map -o u-boot-spl)
  • 5.生成文件分析
1. 链接后生成了 output/spl/u-boot-spl
2. objcopy  生成 output/spl/u-boot-spl-nodtb.bin
arm-linux-gnueabi-objcopy  -j .text -j .secure_text -j .secure_data -j .rodata -j .hash -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn -j .binman_sym_table -j .text_rest -j .dtb.init.rodata  -O binary  spl/u-boot-spl spl/u-boot-spl-nodtb.bin
3. 拷贝得到 最终烧写文件 output/spl/u-boot-spl.bin 
cp spl/u-boot-spl-nodtb.bin spl/u-boot-spl.bin 
  • 6.镜像加载分析
bl0 从 mmc (起始地址?) 加载 8KB 到 0x0c00 0000
并以 0x0c00 0000 位置起始的 4字节数据 为第一个指令,开始执行.
  • 7.镜像运行分析
spl 中 有 位置相关码,...
初始化ddr
调用 itcm 中的 拷贝函数
将 sd卡中的数据(u-boot.bin,起始地址和大小?) 拷贝到 sdram(0x5FB00000)
并以 0x5FB00000 位置起始的 4字节数据 为第一个指令,开始执行.

U-boot

  • 1.配置文件分析
ok6410a_mini_defconfig 中的配置中
不以CONFIG_SPL 开头的配置 都是 u-boot 的配置
  • 2.配置过程分析
同 linux 配置过程
  • 3.编译过程分析
宏观来看,和 u-boot 的编译过程在一起
微观来看,是先将 u-boot 编译链接完,然后再编译链接spl
  • 4.链接过程分析
1.生成链接文件
arm-linux-gnueabi-gcc -E -Wp,-MD,./.u-boot.lds.d -D__KERNEL__ -D__UBOOT__   -D__ARM__ -marm -mno-thumb-interwork  -mabi=aapcs-linux  -mword-relocations  -fno-pic  -ffunction-sections -fdata-sections -fno-common -ffixed-r9  -msoft-float    -pipe -march=armv5t -D__LINUX_ARM_ARCH__=6  -I../arch/arm/mach-s3c64xx/include -Iinclude  -I../include  -I../arch/arm/include -include ../include/linux/kconfig.h  -nostdinc -isystem /home/suws/ok6410/system-new/toolchain/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabi/7.4.1/include -ansi -include ../include/u-boot/u-boot.lds.h -DCPUDIR=arch/arm/cpu/arm1176  -D__ASSEMBLY__ -x assembler-with-cpp -std=c99 -P -o u-boot.lds ../board/samsung/ok6410a/u-boot.lds
2. 链接生成 output/u-boot
arm-linux-gnueabi-ld.bfd  -pie  --gc-sections -Bstatic  --no-dynamic-linker -Ttext 0x5FB00000 -o u-boot -T u-boot.lds arch/arm/cpu/arm1176/start.o --start-group  arch/arm/cpu/built-in.o  arch/arm/cpu/arm1176/built-in.o  arch/arm/lib/built-in.o  arch/arm/mach-s3c64xx/built-in.o  board/samsung/common/built-in.o  board/samsung/ok6410a/built-in.o  cmd/built-in.o  common/built-in.o  disk/built-in.o  drivers/built-in.o  drivers/dma/built-in.o  drivers/gpio/built-in.o  drivers/i2c/built-in.o  drivers/net/built-in.o  drivers/net/phy/built-in.o  drivers/power/built-in.o  drivers/power/battery/built-in.o  drivers/power/domain/built-in.o  drivers/power/fuel_gauge/built-in.o  drivers/power/mfd/built-in.o  drivers/power/pmic/built-in.o  drivers/power/regulator/built-in.o  drivers/serial/built-in.o  drivers/spi/built-in.o  drivers/usb/cdns3/built-in.o  drivers/usb/common/built-in.o  drivers/usb/dwc3/built-in.o  drivers/usb/emul/built-in.o  drivers/usb/eth/built-in.o  drivers/usb/host/built-in.o  drivers/usb/mtu3/built-in.o  drivers/usb/musb-new/built-in.o  drivers/usb/musb/built-in.o  drivers/usb/phy/built-in.o  drivers/usb/ulpi/built-in.o  env/built-in.o  fs/built-in.o  lib/built-in.o  net/built-in.o --end-group arch/arm/lib/eabi_compat.o  arch/arm/lib/lib.a -Map u-boot.map;  true
  • 5.生成文件分析
A.1 链接生成 output/u-boot
A.2 objcopy 生成 output/u-boot-nodtb.bin
arm-linux-gnueabi-objcopy --gap-fill=0xff  -j .text -j .secure_text -j .secure_data -j .rodata -j .hash -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn -j .binman_sym_table -j .text_rest -j .dtb.init.rodata -O binary   u-boot u-boot-nodtb.bin && {
    
      echo '  true'; true; } || rm -f u-boot-nodtb.bin
B.1 生成 output/dts/dt.dtb
mkdir -p arch/arm/dts/ ; (cat ../arch/arm/dts/s3c64xx-ok6410a.dts; ) > arch/arm/dts/.s3c64xx-ok6410a.dtb.pre.tmp; arm-linux-gnueabi-gcc -E -Wp,-MD,arch/arm/dts/.s3c64xx-ok6410a.dtb.d.pre.tmp -nostdinc -I../arch/arm/dts -I../arch/arm/dts/include -Iinclude -I../include -I../arch/arm/include -include ../include/linux/kconfig.h -D__ASSEMBLY__ -undef -D__DTS__ -x assembler-with-cpp -o arch/arm/dts/.s3c64xx-ok6410a.dtb.dts.tmp arch/arm/dts/.s3c64xx-ok6410a.dtb.pre.tmp ; ./scripts/dtc/dtc -O dtb -o arch/arm/dts/s3c64xx-ok6410a.dtb -b 0 -i ../arch/arm/dts/  -Wno-unit_address_vs_reg -Wno-unit_address_format -Wno-avoid_unnecessary_addr_size -Wno-alias_paths -Wno-graph_child_address -Wno-graph_port -Wno-unique_unit_address -Wno-simple_bus_reg -Wno-pci_device_reg -Wno-pci_bridge -Wno-pci_device_bus_num   -Wno-unit_address_vs_reg -Wno-unit_address_format -Wno-avoid_unnecessary_addr_size -Wno-alias_paths -Wno-graph_child_address -Wno-graph_port -Wno-unique_unit_address -Wno-simple_bus_reg -Wno-pci_device_reg -Wno-pci_bridge -Wno-pci_device_bus_num  -d arch/arm/dts/.s3c64xx-ok6410a.dtb.d.dtc.tmp arch/arm/dts/.s3c64xx-ok6410a.dtb.dts.tmp || (echo "Check /home/suws/ok6410/system-new/u-boot/output/arch/arm/dts/.s3c64xx-ok6410a.dtb.pre.tmp for errors" && false) ; cat arch/arm/dts/.s3c64xx-ok6410a.dtb.d.pre.tmp arch/arm/dts/.s3c64xx-ok6410a.dtb.d.dtc.tmp > arch/arm/dts/.s3c64xx-ok6410a.dtb.d ; sed -i "s:arch/arm/dts/.s3c64xx-ok6410a.dtb.pre.tmp:../arch/arm/dts/s3c64xx-ok6410a.dts:" arch/arm/dts/.s3c64xx-ok6410a.dtb.d
cat arch/arm/dts/s3c64xx-ok6410a.dtb > dts/dt.dtb
1. 生成 output/u-boot-dtb.bin
cat u-boot-nodtb.bin dts/dt.dtb > u-boot-dtb.bin
2. 拷贝生成 output/u-boot.bin
cp u-boot-dtb.bin u-boot.bin
  • 6.镜像加载分析
spl 加载 u-boot.bin到 sdram(0x5FB00000)
并以 0x5FB00000 位置起始的 4字节数据 为第一个指令,开始执行.
  • 7.镜像运行分析
u-boot.bin 中 有 位置相关码
之前已经初始化好ddr
然后初始化sd卡
设置好 TAG
加载 fat分区的 uImage 到 0x50008000.
并以 0x50008000位置起始的 4字节数据 为第一个指令,开始执行.

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/115004713