Omap138开发板下以uboot2012.04.01为例分析uboot执行(四)

接上一篇
7.其它内存分配

(1)为TLB页表分配空间

/* reserve TLB table */

addr -= (4096 * 4);

/* round down to next 64 kB limit */

addr &= ~(0x10000 - 1);

往下64k对齐

(2)为uboot镜像(包括代码,数据段和未分配段)预留空间,并四字节对齐

addr -= gd->mon_len;

addr &= ~(4096 - 1);

(3)reserve memory for malloc() area,即分配堆空间。

addr_sp = addr -TOTAL_MALLOC_LEN;

->

#define TOTAL_MALLOC_LEN CONFIG_SYS_MALLOC_LEN

->

#define
CONFIG_SYS_MALLOC_LEN (0x10000 +1 * 1024 * 1024) /* malloc() len */

->

addr_sp=addr-0x10000-0x100000,预留了1088K的位置来临时分配空间。

(4)为bd_t分配空间

(位于uboot/arch/arm/include/asm目录下)

在这里插入图片描述

(5)留12个字节给终止的堆栈使用,经过对齐后实际预留16个字节。

/* leave 3 words for abort-stack */

addr_sp -= 12;



/* 8-byte alignment for ABI compliance */

addr_sp &= ~0x07;

(6)将global_data的波特率赋给板级的指针。

gd->bd->bi_baudrate= gd->baudrate;

(7)
dram_init_banksize();(位于\uboot\arch\arm\cpu\arm926ejs\davinc\misc.c)

->

gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;

gd->bd->bi_dram[0].size =gd->ram_size;

也就是从c0000000开始的512M空间。

(8)display_dram_config ()

显示上一步内存初始化的结果

(9)重定位

gd->relocaddr = addr;

gd->start_addr_sp = addr_sp;

gd->reloc_off = addr - _TEXT_BASE;

memcpy(id, (void*)gd, sizeof(gd_t));/将gd_t的数据复制到重新定位的gd_t的位置/
先引用一张别人的图:
在这里插入图片描述
下面就是根据代码绘出的图:
在这里插入图片描述

relocate_code(addr_sp,id, addr);

主要就是把uboot的镜像搬运到新的位置,涉及到符号表的重写,和内存的搬运,用C语言写比较麻烦,所以就转用汇编语言来完成。

传递的参数主要为:

r0:addr_sp;

r1:id;

r2:addr;

之所以要重定向可能是为kernel腾出低端空间,防止kernel解压覆盖uboot。

猜你喜欢

转载自blog.csdn.net/qq_40788950/article/details/83957075