// 需要分析的一套过程
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字节数据 为第一个指令,开始执行.
上一篇:OK6410A 开发板 (三) 4 u-boot-2021.01 boot 解析 SPL 编译链接部分
下一篇:OK6410A 开发板 (七) 1 OK6410A 文件系统 busybox和buildroot 移植
推荐阅读最新更新时间:2024-11-18 06:23
设计资源 培训 开发板 精华推荐
- DN05067/D,在一体化工作站电源参考设计中使用 GaN HEMT
- 使用 Analog Devices 的 LTC4162IUFD-L40M 的参考设计
- 使用 ROHM Semiconductor 的 BU4915 的参考设计
- 单面洞洞板PCB
- EVAL-ADM1069LQEBZ,评估用于复杂排序的 ADM1069ASTZ 电压监控器排序器的评估板
- A8583 宽输入电压、2.4MHz、3.5A 同步降压稳压器的典型应用
- LTC3526LBEDC-2 固定频率 1 节电池至 2.85V 低噪声升压转换器的典型应用电路
- 使用 Analog Devices 的 LT1021DIN8-10 的参考设计
- AD8112-EVALZ,AD8112 模拟交叉点开关评估板
- MIC5528 的典型应用:采用薄型和超薄 DFN 封装的高性能 500mA LDO