uboot系列之-----板级初始化(源码)
2014-04-09 01:52
363 查看
接上篇,分析uboot对开发板的初始化,入口在arch/arm/lib/board.c文件里面的 board_init_f函数
voidboard_init_f (ulong bootflag)
{
……
gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);
//gd是Uboot里面用于存储全局的系统初始化参数的一个指针,这句话是给改变量赋值,这里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_size为0,SDRAM的大小为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;
//为id和gd->irq_sp开辟空间,起始地址为0xc3cf_bf58 大小为0x78
addr_sp -= 3;
addr_sp &= ~0x07;
......
dram_init_banksize();
//将1G的SDRAM划分成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函数主要是对内存空间做了划分,规定不同的地址空间存放不同的内容。
voidboard_init_f (ulong bootflag)
{
……
gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);
//gd是Uboot里面用于存储全局的系统初始化参数的一个指针,这句话是给改变量赋值,这里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_size为0,SDRAM的大小为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;
//为id和gd->irq_sp开辟空间,起始地址为0xc3cf_bf58 大小为0x78
addr_sp -= 3;
addr_sp &= ~0x07;
......
dram_init_banksize();
//将1G的SDRAM划分成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函数主要是对内存空间做了划分,规定不同的地址空间存放不同的内容。
相关文章推荐
- uboot系列之-----板级初始化(源码)
- UBOOT之源码分析(X4412)——板级初始化
- UBOOT之源码分析(X4412)——板级第二阶段初始化
- uboot系列之------CPU初始化概述(源码)
- Tomcat8源码分析系列-启动分析(二) Catalina初始化
- SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化
- Azkaban的Web Server源码探究系列9: Servlet引擎初始化
- MyBatis源码学习系列:01-初始化
- WorldWind源码剖析系列:WorldWind实时确定、更新、初始化和渲染地形和纹理数据
- 分布式缓存技术redis学习系列(八)——JedisCluster源码解读:集群初始化、slot(槽)的分配、值的存取
- uboot系列之-----代码重定位(源码)
- uboot系列之-----命令的处理过程(源码)
- uboot系列之-----命令的处理过程(源码)
- springMVC系列源码之初始化过程——10
- Bootstrap源码分析系列之初始化和依赖项
- 云星数据---Scala实战系列(精品版)】:Scala入门教程034-Scala实战源码-Scala apply方法02 初始化对象
- Azkaban的Web Server源码探究系列7: ExecutorManager的初始化
- Hadoop1.2.1源码解析系列:JobTracker(一)——JobTracker初始化
- UBOOT之源码分析——初始化环境变量
- SpringMVC源码解读 - HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化