Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3171408
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: 嵌入式

2014-04-19 15:24:59

原文地址:http://blog.csdn.net/xieweihua2012/article/details/8470948

接上篇,分析uboot对开发板的初始化,入口在arch/arm/lib/board.c文件里面的 board_init_f函数

voidboard_init_f (ulong bootflag)

{

        ……

         gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);

   //gdUboot里面用于存储全局的系统初始化参数的一个指针,这句话是给改变量赋值,这里CONFIG_SYS_INIT_SP_ADDR= 0x42e00000 ,所以gd = 0x42e00000

         memset ((void*)gd, 0, sizeof(gd_t));

   //gd开始的地方一直到gd+sizeof(gd_t),给该片内存区域填充0

         gd->mon_len = _bss_end_ofs;

   //gd->mon_len表示uboot的长度

         for (init_fnc_ptr = init_sequence;*init_fnc_ptr; ++init_fnc_ptr) {

                  if ((*init_fnc_ptr)() != 0) {

                           hang ();

                  }

        }

         //这里,init_sequence[]是一个函数指针数组,里面放着若干个初始化的函数指针,for循环就是依次执行这些函数指针所指向的函数

         addr = CONFIG_SYS_SDRAM_BASE +gd->ram_size;

         //addr指向SDRAM的顶部,很不明白的是为什么这里gd->ram_size0SDRAM的大小为0  addr = 0x4000_0000

         ……

         addr -= (4096 * 4);

        addr &= ~(0x10000-1);

        gd->tlb_addr = addr ;  

         //gd->tlb_addr存储的是TLB表的首地址,为0x3fff_0000,该表所分配的大小是64KB

         ……

        addr -= gd->mon_len;

        addr &= ~(4096 - 1);

         //uboot分配空间,起始地址是0x3fe6_c214   大小是0x0018_3dec

         //紧接着开辟4KB的空间,起始地址是0x3fe6_c000

         ……

         addr = CONFIG_SYS_LOAD_ADDR;

        //addr = 0xc3e0_0000加载地址

         addr_sp = addr - TOTAL_MALLOC_LEN;

         //addr_sp = 0xc3cf_c000  表示通过malloc分配的地址空间起始地址,其大小为0x104000

           addr_sp -= sizeof(bd_t);

           bd = (bd_t *) addr_sp;

          gd->bd = bd;

        //gd->bd结构体变量存储的是开发板相关的参数,起始地址为0xc3cf_bfd0  大小是0x30

         addr_sp -= sizeof (gd_t);

         id = (gd_t*) addr_sp;

         gd->irq_sp = addr_sp;

         //idgd->irq_sp开辟空间,起始地址为0xc3cf_bf58 大小为0x78

         addr_sp -= 3;

         addr_sp &= ~0x07;

         ......

         dram_init_banksize();

         //1GSDRAM划分成4个区域

         display_dram_config();

         //根据上面SDRAM的分区计算总的SDRAM大小,然后打印出来

         gd->relocaddr = addr;

         //uboot在内存中的起始地址0XC3E0_0000

         gd->start_addr_sp = addr_sp;

         //堆栈起始地址为0xc3cf_bf50

         gd->reloc_off = addr -_TEXT_BASE;

         //uboot重定位偏移地址0

         memcpy (id, (void *)gd, sizeof(gd_t));

         //gd的全部数据拷贝到id里面

         relocate_code (addr_sp, id, addr);

         //返回到start.s中执行代码重定位

}

 

 

总结:

board_init_f函数主要是对内存空间做了划分,规定不同的地址空间存放不同的内容。

阅读(1077) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~