接上一篇
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。