本次梳理uboot 2016.11 在SMDK2410平台上的代码执行流程。
代码从arch/arm/cpu/Arm920t/start.S开始
1. 设置CPU工作在SVC模式;
2. 禁止开门狗和所有中断;
3. 设置CLK;
4. 设置I/D cache, 禁用MMU
5. 调用lowlevel_init,初始化RAM
6. 调用_main, 在crt0.S (arch\arm\lib)
7. 设置SP,将栈顶地址放入r0,调用board_init_f_alloc_reserve,分配一段区间给global_data,并且16个字节对齐
top = rounddown(top-sizeof(struct global_data), 16);
8.
board_init_f_init_reserve
global_data区数据清0, 并且设置全局变量指针gd
9. board_init_f
|-----initcall_run_list(init_sequence_f)
|--------setup_mon_len(gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;)
|--------initf_malloc(return 0;)
|--------initf_console_record arch_cpu_init mach_cpu_init initf_dm arch_cpu_init_dm
|--------mark_bootstage
|-------- board_early_init_f
Set clock Set GPIO
|--------env_init(Set the global data)
|--------init_baud_rate(set flag) serial_init(set flag) console_init_f
|--------display_options(print version) display_text_info(debug print the bss_start bss_end text_base etc. )
|--------print_cpuinfo
&nbs