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 更容易。

原文地址:https://www.cnblogs.com/plinx/p/3050179.html