S3C6410之uboot回炉再造(5)设置堆栈与跳转至C入口

  直接切入主题

  1、设置堆栈

 1 skip_hw_init:

 2     /* Set up the stack                            */

 3 stack_setup:

 4     ldr    r0, =CONFIG_SYS_UBOOT_BASE    /* base of copy in DRAM        */

          //0x57e0_0000

 5     sub    r0, r0, #CONFIG_SYS_MALLOC_LEN    /* malloc area                      */

          //#define CONFIG_SYS_MALLOC_LEN  (CONFIG_ENV_SIZE + 1024 * 1024)

          //#define CONFIG_ENV_SIZE  0x4000

          //减去环境变量存储区的大小

 6     sub    r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo                        */

          //#define CONFIG_SYS_GBL_DATA_SIZE  128

          //减去全局变量存储区的大小

 7     sub    sp, r0, #12        /* leave 3 words for abort-stack    */

          //留下 12 字节(即 3 个字)的堆栈空间

 8 

  我本人并不信任这段代码、因为我也参考过s3c-uboot1.1.6的代码。

  在s3c-uboot1.1.6的代码中,#ifdef 考虑的内容更全面也更具有逻辑依据一些。

  所以本次仅是分析、制作一套可以成功运行各项基本功能的代码,但在后期实用中不把这套代码当做长期支持使用的代码,以免遇到不可知的bug。

 

  2、清除BSS(Block Started by Symbol)段

 9 clear_bss:

10     ldr    r0, _bss_start     /* find start of bss segment        */

11     ldr    r1, _bss_end       /* stop here                        */

12     mov     r2, #0            /* clear                            */

                   //注释很清楚了…、就不再解释

13 

14 clbss_l:

15     str    r2, [r0]        /* clear loop...                    */

16     add    r0, r0, #4    //循环清除bss

17     cmp    r0, r1

18     ble    clbss_l

19 

20 #ifndef CONFIG_NAND_SPL

21     ldr    pc, _start_armboot  // C入口函数,选择在IRQ中断处理的代码分析之后说

22 

23 _start_armboot:

24     .word start_armboot

25 #else

26     b    nand_boot

27 /*    .word nand_boot*/

28 #endif

  至此,汇编接口的代码就分析完了,再接着就是C语言 start_armboot 的分析了。

  小总结一下 start.S 中的构架,个人还是觉得原版的代码构架更清晰一些。

  在 uboot2010 中,代码构架偏向将 寻址类操作的几种放在 start.S 中,而其他操作的放到 lowlevel_init 中。

  而 uboot1.1.6 更在意 #ifdef 的运用,将更多的设置项分清楚。

  个人觉得 2010 逻辑更优秀,1.1.6 debug 更容易。

 

 

 

你可能感兴趣的:(Boot)