上一章说到了env环境变量并对前两章有关init_sequence部分做了总结,这一章将要对uboot部分的malloc初始化以及内存环境变量进行相关的说明。
mem_malloc_init是用于初始化uboot堆管理器的。自己维护了一段内存,就可用进行malloc和free的操作了。那么这个维护的堆大小是多少呢?
CFG_UBOOT_BASE+CFG_UBOOT_SIZE-CFG_MALLOC_LEN-CFG_STACK_SIZE
给堆留了896Kb的大小,并在其中将这段内存进行清理。
memset((void*)mem_malloc_start,0,mem_malloc_end-mem_malloc_start);
Board specific开发板特别初始化。以#if配合CONFIG_xxx进行条件编译。
#if define(CONFIG_X210)
#if define(CONFIG_GENERIC_MMC)//用MMC/sd卡启动
mmc_initialize(gd->bd):MMC相关基础初始化(SD/MMC控制器)源与内核。
INIT_LIST_HEAD:用链表进行管理(&mmc_devices)。
set_hsmmc_clock()给sd卡控制器时钟。
set_hsmmc_cfg_gpio() mmc的gpio初始化。
smdk_s3c_hsmmc_init() 驱动控制器。
IROM中进行的简单初始化,这个初始化是不完整的所以要在这个进行全面的初始化控制器。
1个扇区512字节,最后得出nMB。
DATAFLASH:SPI/I2C的FLASH如E2PROM,在X210开发板上是没有的。
env_relocate()完成从SD卡到DDR中的读取环境变量。
ENV_IS_EMBEDDED内嵌环境变量,在代码段中(本版本放在SD卡中)。
env_ptr=(env_t*)malloc(CFG_ENV_SIZE)给环境变量开辟内存。
做env CRC校验失败,于是使用uboot的默认env,被写入DDR中,并写入一份到sd卡的env扇区,下次再次开机就能从env分区得到env变量使得CRC校验成功。
set_default_env设置默认env,在其中做变量移动与CRC更新gd_env=1。
env_relocate_spec环境变量重定位。其内部使用movi_read_env()实现。raw_area_control原始分区信息表,gd_env_addr=(ulong)&(env_ptr->data)使用该方法将环境变量赋值到全局环境变量。
本章讲述了一些关于uboot的BL2部分的malloc初始化以及相关内存环境变量的重定位,下一章将会对uboot的其余剩余部分进行讲解(直到uboot的第二部分结束)。