分类: LINUX
2014-06-07 23:46:48
原文地址:uboot 映像的链接基址 作者:michaelgarfield
You can download from site:
CONFIG_SYS_TEXT_BASE(Base address)变量的意义
CONFIG_SYS_TEXT_BASE变量在uboot的两次链接过程都用到,对应的选项是-Ttext $(CONFIG_SYS_TEXT_BASE)指定了text segment的起始链接地址。
Uboot根目录下config.mk文件代码片段
LDFLAGS_FINAL += -Bstatic
//ram start up
LDFLAGS_u-boot += -T $(obj)u-boot.lds $(LDFLAGS_FINAL)
ifneq ($(CONFIG_SYS_TEXT_BASE),)
LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE)
endif
//nand-flash start up
LDFLAGS_u-boot-spl += -T $(obj)u-boot-spl.lds $(LDFLAGS_FINAL)
ifneq ($(CONFIG_SPL_TEXT_BASE),)
LDFLAGS_u-boot-spl += -Ttext $(CONFIG_SPL_TEXT_BASE)
Endif
LDFLAGS_u-boot是链接uboot.bin时用到的变量,man ld查看-Ttext选项的意思是定义text段的起始链接地址。-T选型是指定链接脚本。
在针对tiny6410的平台上的处理是CONFIG_SYS_TEXT_BASE定义在Top/board/$(BOARDDIR)/config.tmp文件中
sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp
ifndef CONFIG_NAND_SPL
CONFIG_SYS_TEXT_BASE = $(RAM_TEXT)
else
CONFIG_SYS_TEXT_BASE = 0
endif
Makefile中对应的tiny6410规则的代码片段定义了以下代码
Echo"RAM_TEXT=0x57e00000">>$(obj)board/samsung/tiny6410/config.tmp;
在uboot-spl的链接过程用到的CONFIG_SPL_TEXT_BASE没有找到对应的定义。Top/nand_spl/board/samsung/ tiny6410/makefile中有LDFLAGS := -T $(nandobj)u-boot.lds -Ttext $(CONFIG_SYS_TEXT_BASE) $(LDFLAGS) $(LDFLAGS_FINAL),其中定义了text段的起始链接地址。
Top/nand_spl/board/samsung/tiny6410/config.mk文件的PAD_TO := $(shell expr $$[$(CONFIG_SYS_TEXT_BASE) + 4096]),PAD_TO的中文意思理解为增加到,即增加到4K的代码。和6410中4k的 steppingstone内存对应。
{~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
S3c6410手册第二章
Boot image area has mirrored image which points a partial region of internal memory area or static memory area. Start address of boot image is fixed to 0x0000_0000.
开机引导映像区域中的镜像是存放在内部的内存或静态存储区域的部分区域里的,镜像的开始地址修正为0x0000_0000.【可以看出引导映像只能从内部内存和存储区启动,并且起始物理地址是0x0000_0000】
Internal memory area is used to access internal ROM and internal SRAM for boot loader, which is also called Steppingstone.
内部存储区域包括内部内存和内部的存储区,就是常说的steppingstone。【其中SRAM是8k,其中4k用作拷贝nand上的数据】
Address range of static memory area is from 0x1000_0000 to 0x3FFF_FFFF. SROM, SRAM, NOR Flash,asyncronous NOR interface device, OneNAND Flash, and Steppingstone can be accessed by this address area.
静态存储区包括内部的内存和存储,外部内存和存储。但是数据和地址总线都是分开的。
Main memory is accessed via SPINE bus, and its address range is from 0x0000_0000 to 0x6FFF_FFFF.【存储区域,特点是地址和数据总线分开】
Pheripheral is accessed via PERI bus, and its address range is from 0x7000_0000 to 0x7FFF_FFFF.【特殊功能寄存器nand数据的传输是从该总线上传输的】
}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【nand启动整体思路:arm上电后:nandflash上的前4k数据被拷到内部内存、内部内存起始地址被映射为0x0000_0000,然后从0x0000_0000处开始执行。因此前4k程序的链接地址要设置为0x0000_0000。】
Top/arch/arm/cpu/XXX/Start.s文件中的
.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE
其中CONFIG_SYS_TEXT_BASE大小的具体定义和平台相关,一般是在makefile里定义的。(而6410处理器对该变量的引用有2处,分别是0和RAM_TEXT($(obj)board/samsung/tiny6410/config.tmp;))