确定_main:
中
CONFIG_SYS_INIT_SP_ADDR的大小
方案1:直接查看推导
方案2:反汇编 u-boot
arm-linux-objdump -D u-boot >u-boot.dis
反汇编得到 u-boot.dis
找到
label:__main 所在的一行
计算: sp = 0x768+#116 = 1986 + 8 +116 = 2020 = 0x7e4
查看信息:
==> CONFIG_SYS_INIT_SP_ADDR
执行完ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
中
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
CONFIG_SYS_INIT_SP_ADDR的大小
方案1:直接查看推导
#define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1
GENERATED_GBL_DATA_SIZE 这个数值在不运行代码的时候,无法进行确定。
#define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_SDRAM_BASE + 0x1000 - \
GENERATED_GBL_DATA_SIZE)
方案2:反汇编 u-boot
arm-linux-objdump -D u-boot >u-boot.dis
反汇编得到 u-boot.dis
找到
label:__main 所在的一行
00000768 <_main>:
768: e59fd074 ldr sp, [pc, #116] ; 7e4 <clbss_l+0x24>
<pre name="code" class="html"> 内存地址 机器码 反汇编 注释<pre name="code" class="html">
pc = pc +8
计算: sp = 0x768+#116 = 1986 + 8 +116 = 2020 = 0x7e4
查看信息:
7e4: 30000f80 andcc r0, r0, r0, lsl #31
==> 0x7e4 单元对应的机器码 30000f80
==> CONFIG_SYS_INIT_SP_ADDR
执行完ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
后的sp = 30000f80
参考:韦东山毕业班视频