直接切入主题
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 更容易。