U-boot分析与移植(2)----U-boot stage1分析
?我们要生成u-boot.bin文件,它首先依赖于很多.o文件和.lds链接脚本文件 我们只要找到对应的.lds链接脚本文件就可以分析u-boot的启动流程。 1、打开u-boot-1.1.6u-boot-1.1.6boardsmdk2410 打开链接脚本boot.lds 看看: OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm") ?. = ALIGN(4); 1)可以看见入口函数是_start 2)这个start代码放在cpu/arm920t/,就是start.S生成的start.o? ? ?2、打开u-boot-1.1.6cpuarm920tstart.S .globl _start ...... ?一开始跳到 reset reset: 设置CPU SVC32模式: ?/* ? * set the cpu to SVC32 mode ? */ mrs?r0,cpsr ?bic?r0,r0,#0x1f?? /*clear 0 at low 5 bit */ ?orr?r0,#0xd3? /*set 110 10011*/ ?????????????????????????? ? /*close irq,fiq,at arm state,at supervisor mode */ ?msr?cpsr,r0????? /*write cpsr*/ I F 为1,关闭FIQ,IRQ T为0,ARM模式 M[4:0]=10011,管理模式 ? 关闭看门狗: ? 向pWTCON全写0 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) ? 关闭所有中断: 但默认已经是关闭的 INTMSK写1,屏蔽对应的中断(默认1) INTSUBMSK写1,屏蔽对应的二级中断(默认1) ?/* ?设置时钟分频比: /* FCLK:HCLK:PCLK = 1:2:4 */ 接着跳入cpu系统初始化: #ifndef CONFIG_SKIP_LOWLEVEL_INIT 在里面再跳入sdram初始化: bl?lowlevel_init 拷贝代码到SDRAM: 十分遗憾,这是给NOR FLASH用的 首先判断_start当前第一条代码位置,如果是在内存中,就不用代码重定位了 #ifndef CONFIG_SKIP_RELOCATE_UBOOT ?ldr?r2,_armboot_start copy_loop: 设置堆栈: stack_setup: 还有设置中断stack ...... 清bss段:
Bss段用来存放未初始化的全局变量和静态变量,在有操作系统的c编译器里默认为0.
但移植u-boot时,所有堆栈,清bss段都是人手设置,我们定义了一个bss段,把这个区域写0,
以后我们c函数运行时,就默认0了。
clear_bss: clbss_l:str?r2,[r0]??/* clear loop...??????????????????? */ ? 跳到c函数入口: ?ldr?pc,_start_armboot _start_armboot:?.word start_armboot 第一阶段基本完成 ldr绝对跳转到_start_armboot函数入口 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |