UBoot源码分析之----内存划分
1 voidboard_init_f (ulong bootflag) 2 3 { 4 5 …… 6 7 gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07); 8 9 //gd是Uboot里面用于存储全局的系统初始化参数的一个指针,这句话是给改变量赋值,这里CONFIG_SYS_INIT_SP_ADDR= 0x42e00000 ,所以gd = 0x42e00000 10 11 memset ((void*)gd, 0, sizeof(gd_t)); 12 13 //从gd开始的地方一直到gd+sizeof(gd_t),给该片内存区域填充0 14 15 gd->mon_len = _bss_end_ofs; 16 17 //gd->mon_len表示uboot的长度 18 19 for (init_fnc_ptr = init_sequence;*init_fnc_ptr; ++init_fnc_ptr) { 20 21 if ((*init_fnc_ptr)() != 0) { 22 23 hang (); 24 25 } 26 27 } 28 29 //这里,init_sequence[]是一个函数指针数组,里面放着若干个初始化的函数指针,for循环就是依次执行这些函数指针所指向的函数 30 31 addr = CONFIG_SYS_SDRAM_BASE +gd->ram_size; 32 33 //addr指向SDRAM的顶部,很不明白的是为什么这里gd->ram_size为0,SDRAM的大小为0 addr = 0x4000_0000 34 35 …… 36 37 addr -= (4096 * 4); 38 39 addr &= ~(0x10000-1); 40 41 gd->tlb_addr = addr ; 42 43 //gd->tlb_addr存储的是TLB表的首地址,为0x3fff_0000,该表所分配的大小是64KB 44 45 …… 46 47 addr -= gd->mon_len; 48 49 addr &= ~(4096 - 1); 50 51 //给uboot分配空间,起始地址是0x3fe6_c214 大小是0x0018_3dec 52 53 //紧接着开辟4KB的空间,起始地址是0x3fe6_c000 54 55 …… 56 57 addr = CONFIG_SYS_LOAD_ADDR; 58 59 //addr = 0xc3e0_0000加载地址 60 61 addr_sp = addr - TOTAL_MALLOC_LEN; 62 63 //addr_sp = 0xc3cf_c000 表示通过malloc分配的地址空间起始地址,其大小为0x104000 64 65 addr_sp -= sizeof(bd_t); 66 67 bd = (bd_t *) addr_sp; 68 69 gd->bd = bd; 70 71 //gd->bd结构体变量存储的是开发板相关的参数,起始地址为0xc3cf_bfd0 大小是0x30 72 73 addr_sp -= sizeof (gd_t); 74 75 id = (gd_t*) addr_sp; 76 77 gd->irq_sp = addr_sp; 78 79 //为id和gd->irq_sp开辟空间,起始地址为0xc3cf_bf58 大小为0x78 80 81 addr_sp -= 3; 82 83 addr_sp &= ~0x07; 84 85 ...... 86 87 dram_init_banksize(); 88 89 //将1G的SDRAM划分成4个区域 90 91 display_dram_config(); 92 93 //根据上面SDRAM的分区计算总的SDRAM大小,然后打印出来 94 95 gd->relocaddr = addr; 96 97 //uboot在内存中的起始地址为0XC3E0_0000 98 99 gd->start_addr_sp = addr_sp; 100 101 //堆栈起始地址为0xc3cf_bf50 102 103 gd->reloc_off = addr -_TEXT_BASE; 104 105 //uboot重定位偏移地址0 106 107 memcpy (id, (void *)gd, sizeof(gd_t)); 108 109 //将gd的全部数据拷贝到id里面 110 111 relocate_code (addr_sp, id, addr); 112 113 //返回到start.s中执行代码重定位 114 115 }
总结:
board_init_f函数主要是对内存空间做了划分,规定不同的地址空间存放不同的内容。
空间分布如下: