6200 uboot 测试版分析(三)

小结:

uboot中_start开始执行一段程序(基本配置,这一段在6200 sdboot时已经执行过了)跳到start_unicoreboot执行,完成init_sequence[]中的一系列初始化。注意初始化序列之前gd(gd_t*类型)被赋予一个常数值,gd所指向中的bd指针也赋予一常数值。在初始化序列中,务必注意board_init中对gd->bd->bi_boot_params的赋值(0x40000100),因为在紧临近执行theKernel (0, machid, bd->bi_boot_params)前,我们会把需要传给内核的参数都赋给params指针所指向的struct tag类型占据的空间中,然而,这块空间的地址(即params的值)是通过setup_start_tag (bd)函数中语句params = (struct tag *) bd->bi_boot_params;完成的,即params也可看成是个常量值。正常流程下,执行“nand read xxxxx;bootm xxxx”将uImage载入内存,从环境变量中解析出bootm命令,并解析参数,从嵌入(看下链接脚本)的cmd_tbl_t中查找执行bootm所对应的函数,并调用此函数,即do_bootm。do_bootm函数读取镜像的头部image_head,获得镜像压缩格式(根据镜像的头部信息即可获得压缩格式,当然也可能未压缩,这要看镜像是怎么做的了。并且镜像头中含有应将解压出的操作系统放在内存的何处),操作系统类型(6200:linux),根据类型再执行do_bootm_linux,do_bootm_linux中会获取系统执行入口点,在进入行头前,会把一些参数放在struct tag结构体中,以备系统获取参数,最后调用theKernel (0, machid, bd->bi_boot_params);

疑问:

default_environment[] 是一个全局变量,应该放在data段,但是在env_relocate()时将gdt->env_addr却被置成0,尤其是对于void *malloc(int len) 函数,非常不解为什么永远返回都是null。而后,又把default_environment处的环境变量拷贝到0开始处,并且将取环境变量的函数由 env_get_char_init() 换成了env_get_char_memory()函数,而且把gd->env_valid置成了1。再者就是jumptable_init()函数,因为对于这一版的代码,在jumptable_init()中也用了malloc函数,而且向所分配的空间中写入数据,那么我们的环境变量就被冲掉了。

你可能感兴趣的:(Boot)