U-BOOT移植过程详解: u-boot.bin

本文详细记录了U-Boot移植过程,从u-boot.bin的文件组成到代码分析,涉及start.S、ctro.S、board_init_f及board_init_r等关键部分。文章探讨了u-boot.bin的编译依赖、链接脚本查找路径,并指出在不同阶段board_init_f和board_init_r的实现差异。同时,强调了全局数据结构global_data的重要性以及需要在特定目录下实现的函数。
摘要由CSDN通过智能技术生成

申明

  本着学习交流的原则, 将个人移植u-boot的过程做一个记录. 文章参考了csdn blog里面的很多内容, 有的已经记不得出处了, 只好把当时的摘要直接贴出来. 如果冒犯, 还请见谅. 如有侵权, 请与我邮件联系. 谢谢!


u-boot.bin

这里的u-boot.bin指的是不包含SPL的stage2部分的代码. 它会被SPL搬移到RAM的某个地址处开始运行. 本篇下面提到的u-boot.bin时, 也是指的这个概念.

u-boot.bin的文件组成

当我们在uboot下执行make命令的时候, 它最核心的功能是执行Makefile中的all目标编译出相应的文件. 我们来看看这个all目标
all:		$(ALL-y) $(SUBDIR_EXAMPLES)

all依赖于 $(ALL-y) 和 $(SUBDIR_EXAMPLES), 这里我只关注ALL-y, 如下:
# Always append ALL so that arch config.mk's can add custom ones
ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map

ALL-$(CONFIG_NAND_U_BOOT) += $(obj)u-boot-nand.bin
ALL-$(CONFIG_ONENAND_U_BOOT) += $(obj)u-boot-onenand.bin
ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin
ALL-$(CONFIG_SPL_FRAMEWORK) += $(obj)u-boot.img
ALL-$(CONFIG_TPL) += $(obj)tpl/u-boot-tpl.bin
ALL-$(CONFIG_OF_SEPARATE) += $(obj)u-boot.dtb $(obj)u-boot-dtb.bin
ifneq ($(CONFIG_SPL_TARGET),)
ALL-$(CONFIG_SPL) += $(obj)$(subst ",,$(CONFIG_SPL_TARGET))
endif

# enable combined SPL/u-boot/dtb rules for tegra
ifneq ($(CONFIG_TEGRA),)
ifeq ($(CONFIG_OF_SEPARATE),y)
ALL-y += $(obj)u-boot-dtb-tegra.bin
else
ALL-y += $(obj)u-boot-nodtb-tegra.bin
endif
endif

注意红色部分的代码, 它表面all目标依赖 $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map

先忽略System.map, 在看下面一段
$(obj)u-boot.srec:	$(obj)u-boot
		$(OBJCOPY) -O srec $< $@

$(obj)u-boot.bin:	$(obj)u-boot
		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
		$(BOARD_SIZE_CHECK)
它们都依赖于u-boot

那么在看看u-boot的依赖关系
ifeq ($(CONFIG_SANDBOX),y)
GEN_UBOOT = \
		cd $(LNDIR) && $(CC) $(SYMS) -T $(obj)u-boot.lds \
			-Wl,--start-group $(__LIBS) -Wl,--end-group \
			$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map -o u-boot
else
GEN_UBOOT = \
		cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) \
			$(__OBJS) \
			--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
			-Map u-boot.map -o u-boot
endif

$(obj)u-boot:	depend \
		$(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
		$(GEN_UBOOT)
  • depend: 参考附录中的depend
  • $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) : 各个子目录
  • $(LDSCRIPT) : 如下, 默认就是在arch/arm/cpu/下面的u-boot.lds
  • # If board code explicitly specified LDSCRIPT or CONFIG_SYS_LDSCRIPT, use
    # that (or fail if absent).  Otherwise, search for a linker script in a
    # standard location.
    
    
    LDSCRIPT_MAKEFILE_DIR = $(dir $(LDSCRIPT))
    
    
    ifndef LDSCRIPT
    	#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
    	ifdef CONFIG_SYS_LDSCRIPT
    		# need to strip off double quotes
    		LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
    	endif
    endif
    
    
    # If there is no specified link script, we look in a number of places for it
    ifndef LDSCRIPT
    	ifeq ($(CONFIG_NAND_U_BOOT),y)
    		LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
    		ifeq ($(wildcard $(LDSCRIPT)),)
    			LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot-nand.lds
    		endif
    	endif
    	ifeq ($(wildcard $(LDSCRIPT)),)
    		LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
    	endif
    	ifeq ($(wildcard $(LDSCRIPT)),)
    		LDSCRIPT := $(TOPDIR)/$(CPUDIR)/u-boot.lds
    	endif
    	ifeq ($(wildcard $(LDSCRIPT)),)
    		LDSCRIPT := $(TOPDIR)/arch/$(ARCH)/cpu/u-boot.lds
    		# We don't expect a Makefile here
    
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值