注:该分析尚未完全完成,根据移植需要再添加内容
启动分析
根据分析可以知道使用arch/arm/cpu/u-boot.lds链接文件,其中".__image_copy_start"没有使用,所以最开始是.vectors段,人口是_start。并该段在arch/arm/lib/vectors.s中,主要记录了中断向量,然后跳入reset,即arch/arm/cpu/arm920t/start.S的reset标号。
(1)arch/arm/cpu/arm920t/start.S
设置为svc32模式
关看门狗
关中断
设置时钟
cpu_init_crit
关cache
关mmu
lowlevel_init
初始化存储控制器
bl _main
<!-增加跳入SRAM的代码!->
跳到arch/arm/lib/crt0.S执行
(2)arch/arm/lib/crt0.S
_main (在arch/arm/lib/crt0.S中)
设置栈指针
分配全局变量gd的栈空间,并设置r9指向gd。注:gd_t在include/asm-generic/global_datt.h中定义
如果配置了,就分配堆空间,暂时没有发现使用,所以忽略。
最后得到的堆栈空间如"绘图1.vsdx"所示。
清空gd的内存空间。
board_init_f
注:有多个board_init_f函数,根据Makefile和smdk2410的配置,可以得知调用common/board_f.c中的board_init_f
zero_global_data
清空gd结构体对象
initcall_run_list
执行init_sequence_f列表的函数
......
board_early_init_f
设置时钟和GPIO(需要修改)
env_init
由于定义了CONFIG_ENV_IS_IN_NAND(这个按照mini2440分析,实质smdk2410是使用norflash而不是nandflash记录配置)
如果存在环境变量,更新gd->env_addr指向的地址为environment的data变量
init_baud_rate
serial_init
console_init_f
print_cpuinfo
announce_dram_init
dram_init
setup_machine
reserve_global_data
reserve_fdt
reserve_arch
reserve_stacks
setup_dram_config
show_dram_config
以上都要写初始化内容和设置gd的内容
然后在回到ctr0.S中继续执行
跳入relocate_code(arch/arm/lib/relocate.S中)
完成重定向工作
跳转会ctr0.s(注:这里跳转会重定位后的代码,进入relocate_code之前已经计算好lr了)
c_runtime_cpu_setup实质什么都没做
清空bss段
跳转到board_init_r
执行init_sequence_r的函数
...
一系列初始化
...
run_main_loop
循环执行main_loop
进入循环命令行模式
stored_bootdelay
更新stored_bootdelay,并返回bootcmd参数
autoboot_command
加入到时间不中断,就自动启动,来源于bootcmd参数设置。
cli_simple_loop分析 并执行命令