首页 > 技术文章 > UBoot源码分析之----内存划分

zhang2318 2016-11-18 14:26 原文

 

  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函数主要是对内存空间做了划分,规定不同的地址空间存放不同的内容。

空间分布如下:

推荐阅读