一、uboot中的链接器脚本u-boot.lds分析:
.text : //代码段
{
*(.__image_copy_start) //u-boot将自己copy到RAM,此为需要copy的程序的start
*(.vectors)
CPUDIR/start.o (.text*) // /arch/arm/cpu/armv8/start.S
*(.text*) //其他的代码段放在这里,即start.S/vector.S之后
}
这里可以看出 /arch/arm/cpu/armv7/start.S为uboot的入口地址, /arch/arm/cpu/armv8/这个目录怎么得到的呢?首先进到u-boot根目录找到config.mk(这才是真正的Makefile),该文件中有如下声明:
ARCH := $(CONFIG_SYS_ARCH:"%"=%)
CPU := $(CONFIG_SYS_CPU:"%"=%)
ifdef CONFIG_SPL_BUILD
ifdef CONFIG_TEGRA
CPU := arm720t
endif
endif
BOARD := $(CONFIG_SYS_BOARD:"%"=%)
ifneq ($(CONFIG_SYS_VENDOR),)
VENDOR := $(CONFIG_SYS_VENDOR:"%"=%)
endif
ifneq ($(CONFIG_SYS_SOC),)
SOC := $(CONFIG_SYS_SOC:"%"=%)
endif
CPUDIR=arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)
像CONFIG_SYS_ARCH、CONFIG_SYS_CPU等等这些宏是在哪里定义的呢,也在u-boot顶层目录中有一个叫u-boot.cfg的文件,里面定义了很多宏,我们列举上面需要用到的:
#define CONFIG_SYS_ARCH "arm"
#define CONFIG_SYS_CPU "armv8"
#define CONFIG_SYS_BOARD "evb_rk3308"
#define CONFIG_SYS_VENDOR "rockchip"
#define CONFIG_SYS_SOC "rockchip"
所以上面start.S的路径就是:arch/arm/cpu/armv8/start.S
二、下面分析dts文件:
在u-boot顶级目录下一个dts文件目录,打开文件目录下的Makefile,内容如下
DEVICE_TREE ?= $(CONFIG_DEFAULT_DEVICE_TREE:"%"=%)
ifeq ($(DEVICE_TREE),)
DEVICE_TREE := unset
endif
ARCH_PATH := arch/$(ARCH)/dts
dtb_depends := arch-dtbs
ifneq ($(EXT_DTB),)
DTB := $(EXT_DTB)
else
DTB := $(ARCH_PATH)/$(DEVICE_TREE).dtb
dtb_depends += $(DTB:.dtb=.dts)
endif
根据上面的u-boot.cfg找到CONFIG_DEFAULT_DEVICE_TRE宏定义如下:
#define CONFIG_DEFAULT_DEVICE_TREE “rk3308-evb”
所以该sdk用的dts为rk3308-evb.dts