ARM Uboot经历——Uboot地址问题

讲一个地址问题,主要围绕三个地址来介绍:编译地址,加载地址,运行地址。

其实不光是Uboot,Linux也有这三个地址;这三个地址是存在联系的,用户需要明确的知道这三个地址各代表什么意思,如何去设置和运用。

事先说明的是,这里的三个地址都是首地址,也就是起始地址。

概念

编译地址:在编译Image的时候输入给编译器的地址,编译器在链接的时候会按照指定的地址分配代码和数据;

加载地址:Image拷入到RMA时的地址,这里的RAM不一定是DDR,也可能是flash之类;

运行地址:代码开始运行时的地址


特点

编译地址

编译地址一般在链接的文件中指定,比如uboot在arch\arm\cpu\u-boot.lds文件中规定,如:

UTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
	. = 0x00000000
	. = ALIGN(4);
	.text :
	{
		__image_copy_start = .;
		CPUDIR/start.o (.text*)
		*(.text*)
	}

这里的编译起始地址就是0x00000000,也就是编译器从0x00000000开始分配代码和内存。

上面例子中__image_copy_start = 0x00000000,start.o里面的代码段也是从0x00000000开始分配。

加载地址

将编译完成的uboot的可执行文件拷贝到单板中时的拷贝地址,比如我们拷贝的地址是0x0c001000,这个地址通常由用户指定,在include\configs\*****.h中决定。

****就是你对应单板的名字,如:

/* SoC Configuration */
#define CONFIG_ARMV7
#define CONFIG_ARCH_CPU_INIT
#define CONFIG_SYS_ARCH_TIMER
#define CONFIG_SYS_HZ_CLOCK     clk_get_rate(TCI6638_CLK1_6)
#define CONFIG_SYS_HZ           1000
#define CONFIG_SYS_TEXT_BASE        0x0c001000
#define CONFIG_OF_LIBFDT        1
#define CONFIG_OF_BOARD_SETUP
#define CONFIG_SYS_DCACHE_OFF

这个地址在start.s中也有使用,如下:

.globl _TEXT_BASE
_TEXT_BASE:
	.word	CONFIG_SYS_TEXT_BASE
也就是定义了一个全局变量 _TEXT_BASE,这个全局变量会保存你的加载地址。

运行地址

运行地址在uboot中是重定位后的地址位置。这个地址在uboot中是根据内存来动态计算的,而在Linux中是指定的。

uboot的计算方法如下(该代码在arch\arm\lib\board.c中的board_init_f()中):

1)初始化外部的RAM,通常是DDR,得到DDR的首地址的尾地址

2)从尾地址开始往回倒数,倒数64kb,预留给TLB使用(但一般都用不到)

3)再倒数,根据uboot编译完成的Image大小,预留出memory给uboot,得到uboot重定位的首地址,也就是我们的运行地址;


计算方法

这里从Kernel里面摘取一段代码来说明地址的互算方式。

__fixup_smp_on_up:
	adr	r0, 1f			
	// r0是保存了lable 1的运行地址
	ldmia	r0, {r3 - r5}		
	// r3,r4,r5分别保存了 label 1,__smpalt_begin, __smpalt_end的编译地址
	sub	r3, r0, r3		
	// 将lable 1的运行地址减去编译地址,得到一个偏移offset
	add	r4, r4, r3		// 将得到的偏移加上原始的编译地址,就得到了__smpalt_begin的运行地址
	add	r5, r5, r3
	b	__do_fixup_smp_on_up
ENDPROC(__fixup_smp)

	.align
1:	.word	.
	.word	__smpalt_begin
	.word	__smpalt_end

由上面代码来看,重定位之后,由于在链接时赋值的地址都是编译地址,因此这些变量需要经过转换之后才能使用。这也是kernel常用的一种手法。








  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值