您的位置:首页 > 其它

JZ2440平台移植uboot 2016.11(三)

2018-01-17 10:07 1381 查看
本节中,试着梳理 uboot 的内存分配结构.

内存分配从arch/arm/lib/crt0.S中的_main函数开始

第一部分内存分配

ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#sp = 0x30000000 + 0x1000


mov r0, sp
bl  board_init_f_alloc_reserve
mov sp, r0
#sp = 0x30001000 - sizeof(struct global_data)


mov r9, r0
bl  board_init_f_init_reserve
#r9 = 0x30001000 - sizeof(struct global_data)


此时,可以看出,全局变量区位于如下示意图



之后开始调用board_init_f

initcall_run_list(init_sequence_f)


gd->mon_len = (ulong)&__bss_end - (ulong)_start;
bss_start = (ulong)&__bss_start;
bss_end = (ulong)&__bss_end;
text_base = CONFIG_SYS_TEXT_BASE;
#__bss_start  __bss_end 在代码连接文件中定义
gd->ram_size = PHYS_SDRAM_1_SIZE;
#gd->ram_size = 0x04000000


之后,从setup_dest_addr函数开始进一步分配内存空间

gd->ram_top += get_effective_memsize();
gd->relocaddr = gd->ram_top;
#gd->ram_top = gd->relocaddr = 0x34000000


之后分配MMU内存

gd->arch.tlb_size = PGTABLE_SIZE;
gd->relocaddr -= gd->arch.tlb_size;

/* round down to next 64 kB limit */
gd->relocaddr &= ~(0x10000 - 1);

gd->arch.tlb_addr = gd->relocaddr;


如果定义了LCD, video等,在这之后为他们分配存储空间

下面是为uboot分配存储空间,uboot最后为bss段

gd->relocaddr -= gd->mon_len;
gd->relocaddr &= ~(4096 - 1);
gd->start_addr_sp = gd->relocaddr;


gd->relocaddr 停留着这, gd->start_addr_sp继续

gd->start_addr_sp = gd->start_addr_sp - TOTAL_MALLOC_LEN;
gd->start_addr_sp -= sizeof(bd_t);


下面重新为global data分配存储空间

gd->start_addr_sp -= sizeof(gd_t);
gd->new_gd = (gd_t *)map_sysmem(gd->start_addr_sp, sizeof(gd_t));


gd->start_addr_sp -= 16;
gd->start_addr_sp &= ~0xf;


下面是设置malloc分配空间

malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN;
mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
TOTAL_MALLOC_LEN);


经过上面的分配,现在内存分布如下图



到此,内存分布分析便结束了,里面有什么不合适的地方,还请各位朋友指正,非常感谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: