【Uboot学习随笔-基于tiny6410和uboot-2010.09】之-----TEXT_BASE

来源:互联网 发布:淘宝助理4.7官方 编辑:程序博客网 时间:2024/05/16 16:13

随笔中记录的都是笔者学习Uboot过程中遇到的一些问题和解决方法,主要是将解决问题的过程和一些小经验、小技巧记录了下来。现在把一些感觉有点价值的内容搬到博客中供读者参考。

 

-----------------12.23-----------------


19:55
追踪UBoot中 TEXT_BASE 的定义:
1.Makefile的 smdk6400_config 目标下有一句:echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;这里,RAM_TEXT的值写入到了 board/samsung/smdk6400目录下的config.tmp文件中。所以make config后就有了这个config.tmp文件。
2.进入board/samsung/smdk6400,可以看到1.中生成的config.tmp文件。除此之外,还有一个config.mk文件,进入一看,哦,原来这样:
sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
ifndef CONFIG_NAND_SPL
TEXT_BASE = $(RAM_TEXT)
else
TEXT_BASE = 0
endif
TEXT_BASE出现了!可见这个文件包含了刚才生成的tmp文件,并且在下面用RAM_TEXT定义了TEXT_BASE。

3.这还不够,因为很多源代码文件里都用到了这个定义,这个定义必须通知每一个文件,而且LD的链接选项也需要它。如何实现的呢?进入源码顶层目录,顶层目录下也有一个config.mk文件,进入看看,发现这样一句:
ifdef   BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk  # include board specific rules
endif
好了,刚才的config.mk被包含到顶层目录的config.mk中了,而顶层目录的config.mk会直接包含到顶层Makefile中。
此外,config.mk文件中还有:

ifneq ($(TEXT_BASE),)
LDFLAGS += -Ttext $(TEXT_BASE)
endif
……
ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif
……
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
……
AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
……
$(obj)%.o:      %.S
        $(CC)  $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) \
                -o $@ $< -c
$(obj)%.o:      %.c
        $(CC)  $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
                -o $@ $< -c
这样TEXT_BASE的值就被传到连接选项和编译选项里了。
由此可以看出,TEXT_BASE定义的根源在于顶层Makefile中相应的config目标下。如修改“echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;”中的RAM_TEXT即可。

同时,对于6410,TEXT_BASE的定义还会影响 CONFIG_ENABLE_MMU。在  include/configs/smdk6400.h 中,有:
#if !defined(CONFIG_NAND_SPL) && (TEXT_BASE >= 0xc0000000)
#define CONFIG_ENABLE_MMU
#endif
可见,如果TEXT_BASE大于0xc0000000的话会启用MMU。

 

原创粉丝点击