EDN China > 设计实例 > 嵌入式系统 > 参考设计 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

(多图)基于cortex-A8的Bootloader设计

叶茂?? 李智?? 任和?? 2015年05月06日 ?? 收藏4

2.3.2 第二阶段初始化

U-Boot进入第二阶段后会首先声明一个gd_t结构体类型的指针指向内存地址(0x40000000 - GD_SIZE)处。0x40000000为内存结束地址,GD_SIZE为结构体gd_t的大小。这样相当于在内存最顶端分配了一段空间用于存放一个临时结构体gd_t。该结构体在global_data.h中被定义,U-Boot用它来存储所有的全局变量。之后U-Boot会调用board_init_f()和board_init_r()两个函数进一步对底板进行初始化。

(1)board_init_f()

进入board_init_f()之后,U-Boot首先设置之前分配的临时结构体,然后开始划分内存空间,其内存分配示意图如下:

图3  U-Boot内存分配状态
图3 U-Boot内存分配状态

从内存分配状态图中我们可以看到,gd指针指向的临时结构体存放在内存的最顶部。BL2代码存放在内存地址0x3ff00000处,即距离内存顶部1M空间的位置。接下来依次分配malloc空间,bd_t结构体空间和gd_t结构体空间,并且重新设置栈。最后将临时结构体拷贝到id指针所指向的位置。board_init_f()实现过程大致如下:

unsigned int board_init_f(ulong bootflag)

{

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

...

设置gd结构体;

...

addr = CONFIG_SYS_TEXT_BASE; /* CONFIG_SYS_TEXT_BASE = 0x3ff00000000 */

addr_sp = addr - TOTAL_MALLOC_LEN;

addr_sp -= sizeof (bd_t);

bd = (bd_t *) addr_sp;

gd->bd = bd;

addr_sp -= sizeof (gd_t);

id = (gd_t *) addr_sp;

...

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

base_sp = addr_sp;

return (unsigned int)id;

}

(2)board_init_r()

board_init_r()负责对其他硬件资源进行初始化。如网卡、Flash、MMC、中断等。最后调用main_loop(),等待用户输入命令。

【分页导航】


?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

cortext-A8? Bootloader设计? s5pv210?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈