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