uboot学习之五《gd地址分析》

arch/arm/lib/crt0.S ldrsp, =(CONFIG_SYS_INIT_SP_ADDR) include/configs/mx6ull_emmc.h #define CONFIG_SYS_INIT_SP_ADDR \ (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)...

arch/arm/lib/crt0.S

ldrsp, =(CONFIG_SYS_INIT_SP_ADDR)


include/configs/mx6ull_emmc.h

#define CONFIG_SYS_INIT_SP_ADDR \

(CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)

#define CONFIG_SYS_INIT_RAM_SIZEIRAM_SIZE

#define CONFIG_SYS_INIT_RAM_ADDRIRAM_BASE_ADDR

#define CONFIG_SYS_INIT_SP_OFFSET \

(IRAM_SIZE- GENERATED_GBL_DATA_SIZE)

那么

#define CONFIG_SYS_INIT_SP_ADDR \

(IRAM_BASE_ADDR + IRAM_SIZE- GENERATED_GBL_DATA_SIZE)

arch/arm/include/asm/arch-mx6/imx-regs.h

#define IRAM_BASE_ADDR0x00900000

#if !(defined(CONFIG_MX6SX) || defined(CONFIG_MX6UL) || \
defined(CONFIG_MX6SLL) || defined(CONFIG_MX6SL))
#define IRAM_SIZE                    0x00040000
#else
#define IRAM_SIZE                    0x00020000
#endif
由于定义了CONFIG_MX6UL
所以#define IRAM_SIZE                    0x00020000

#define CONFIG_SYS_INIT_SP_ADDR \

(0x00900000+0x00020000- GENERATED_GBL_DATA_SIZE)

include/generated/generic-asm-offsets.h
#define GENERATED_GBL_DATA_SIZE 256 /* (sizeof(struct global_data) + 15) & ~15@ */

#define CONFIG_SYS_INIT_SP_ADDR \

(0x00900000+0x00020000- 256)

所以CONFIG_SYS_INIT_SP_ADDR为0X0091FF00

include/generated/autoconf.h
#define CONFIG_SYS_MALLOC_F_LEN 0x400

common/init/board_init.c

ulong board_init_f_alloc_reserve(ulong top)
{
/* Reserve early malloc arena */
#if defined(CONFIG_SYS_MALLOC_F)
top -= CONFIG_SYS_MALLOC_F_LEN;
#endif
/* LAST : reserve GD (rounded up to a multiple of 16 bytes) */
top = rounddown(top-sizeof(struct global_data), 16);

return top;
}
sizeof(struct global_data)= 248 (GD_SIZE value)
top=top-CONFIG_SYS_MALLOC_F_LEN-sizeof(struct global_data)
top=0X0091FF00-0x400-248 
top=0x91fa00

你可能感兴趣的文章

相关问题

0 条评论&回复

请先 登录 后评论
DebugArm
DebugArm

5 篇文章

作家榜 »

  1. 百问网-周老师 18 文章
  2. st_ashang 14 文章
  3. 渐进 12 文章
  4. zxq 11 文章
  5. helloworld 8 文章
  6. 谢工 5 文章
  7. Litchi_Zheng 5 文章
  8. DebugArm 5 文章