uboot version : 1.3.4
CPU : s5pv210
开发板 : 九鼎x210
分析工具 : Source Insight
1. uboot初始化raw分区代码
在学完uboot的大致体系后,我一直有个问题不太清楚,那就是在uboot通过fastboot烧录镜像时所用的分区名究竟在何时定义过,raw分区究竟是怎样安排在iNand(启动介质)中的,带着这些问题,我又从uboot启动第二阶段开始寻找踪迹。想了想,既然环境变量也有分区,那在环境变量重定义代码中必定能找到相应的分区初始化代码,所以以…/uboot/lib_arm/board.c 文件中的start_armboot 函数为起点,找到调用env_relocate 函数的地方,这个函数就是环境变量重定位的函数。进入这个函数的定义处,在删除一些条件编译没有编译的代码后,可以得到如下几行代码:
env_ptr = (env_t *)malloc(CFG_ENV_SIZE);
if (gd->env_valid == 0) {
puts ("*** Warning - bad CRC, using default environment\n\n");
set_default_env();
else {
env_relocate_spec();
}
gd->env_addr = (ulong)&(env_ptr->data);
第一句为全局变量env_ptr分配了一块内存,大小是环境变量分区的大小(这里是16KB),你跳到malloc 函数定义处,可能会发现malloc函数返回值是NULL,其实是SI软件的问题,你只要查看malloc.h 文件就可以发现malloc 函数其实是Dlmalloc.c 文件中的mALLOc 函数的别名,通过宏定义实现。然后由于在第二阶段一开始的初始化函数env_init 中就将gd->env_valid置为1,所以始终会执行env_relocate_spec 函数。跳到env_relocate_spec 函数定义处,可以发现有如下几行代码:
uint *magic = (uint*)(PHYS_SDRAM_1);
if ((0x24564236 != magic[0]) || (0x20764316 != magic[1]))
movi_read_env(virt_to_phys((ulong)env_ptr));
if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
return use_default();
第一个if语句判断PHYS_SDRAM_1内存地址处是否有魔数0x24564236或者PHYS_SDRAM_1+4地址处是否有魔数0x20764316,我们之前并没有填充过这两个区域,所以执行movi_read_env 函数。重点来了,跳入函数定义处,发现一个全局变量raw_area_control,查看其定义如下:
/*
* magic_number: 0x24564236
* start_blk: start block number for raw area
* total_blk: total block number of card
* next_raw_area: add next raw_area structure
* description: description for raw_area
* image: several image that is controlled by raw_area structure
* by scsuh
*/