JZ2440平台移植uboot 2016.11(三)

本文详细介绍了在JZ2440平台上移植uboot 2016.11过程中,内存分配的完整过程,从全局变量区开始,经过board_init_f,setup_dest_addr,MMU内存分配,以及LCD、video等设备的内存分配,最终为uboot本身及bss段分配空间。文章结尾展示了内存分布图,并邀请读者指正可能存在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节中,试着梳理 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);

经过上面的分配,现在内存分布如下图
这里写图片描述

到此,内存分布分析便结束了,里面有什么不合适的地方,还请各位朋友指正,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值