关于uboot代码所设置的raw分区分析


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
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值