首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

U-boot启动分析 -arm(2)

U-boot启动分析 -arm(2)

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;
    . = ALIGN(4);
    .text     :
    {
     cpu/arm920t/start.o   (.text)
     *(.text)
    }
    . = ALIGN(4);
    .rodata : { *(.rodata)}
    . = ALIGN(4);
    .data : { *(.data) }
    . = ALIGN(4);
    .got : { *(.got) }
    . = .;
    __u_boot_cmd_start = .;
    .u_boot_cmd : {*(.u_boot_cmd) }
    __u_boot_cmd_end = .;
    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) }
    _end = .;
}
从上面可以看出,链接脚本指定了代码段从0x00000000开始,而代码段最开始链接的就是cpu/arm920t/start.o。于是可以知道在CPU加电复位后程序首先是从cpu/arm920t/start.S开始的。
1.Stage1:cpu/arm920t/start.S
当系统启动时, ARM CPU会跳到0x00000000去执行。一般BootLoader都包括如下几个部分:
1. 建立中断向量异常表
2. 显示的切换到SVC且32指令模式
3. 关闭S3C2410的内部看门狗
4. 禁止所有的中断
5. 配置系统时钟频率和总线频率
6. 设置内存区的控制寄存器
7. 初始化中断
8. 安装中断向表量
9. 把可执行文件的各个段搬到运行态的各个位置
10. 跳到C代码部分执行
具体分析如下:

.globl _start
_start:    b     reset  
    ldr   pc, _undefined_instruction
    ldr   pc, _software_interrupt
    ldr   pc, _prefetch_abort  
    ldr   pc, _data_abort     
    ldr   pc, _not_used      
    ldr   pc, _irq         
    ldr   pc, _fiq         
_undefined_instruction:    .wordundefined_instruction
_software_interrupt:    .wordsoftware_interrupt
_prefetch_abort:    .wordprefetch_abort
_data_abort:       .worddata_abort
_not_used:       .wordnot_used
_irq:          .wordirq
_fiq:          .wordfiq
    .balignl 16,0xdeadbeef

***************************************************************
* 当一个异常出现以后,ARM会自动执行以下几个步骤:
* (1) 把下一条指令的地址放到连接寄存器LR(通常是R14),这样就能够在处理异常返回时从正确的位置继续执行。
* (2)将相应的CPSR(当前程序状态寄存器)复制到SPSR(备份的程序状态寄存器)中。从异常退出的时候,就可以由SPSR来恢复CPSR。
* (3) 根据异常类型,强制设置CPSR的运行模式位。
* (4) PC(程序计数器)被强制成相关异常向量处理函数地址,从而跳转到相应的异常处理程序中。
*
* 当异常处理完毕后,ARM会执行以下几步操作从异常返回:
* (1) 将连接寄存器LR的值减去相应的偏移量后送到PC中
* (2) 将SPSR复制回CPSR中
* (3) 若在进入异常处理时设置了中断禁止位,要在此清除
上述代码即碰到异常时,PC会被强制设置为对应的异常向量,从而跳转到
相应的处理程序,然后再返回到主程序继续执行。
******************************************************************


_TEXT_BASE:
    .word   TEXT_BASE
.globl _armboot_start
_armboot_start:
    .word _start

.globl _bss_start
_bss_start:
    .word __bss_start
.globl _bss_end
_bss_end:
    .word _end
#ifdef CONFIG_USE_IRQ

.globl IRQ_STACK_START
IRQ_STACK_START:
    .word   0x0badc0de

.globl FIQ_STACK_START
FIQ_STACK_START:
    .word 0x0badc0de
#endif

上述代码主要是用于保存一些全局变量,用于启动程序将代码从flash
拷贝到RAM或其他使用。有一些变量的值是通过链接脚本得到的,如
TEXT_BASE位于/u-boot-1.1.6/board/xxx(开发板目录名称)/config.mk
* 文件里。__bss_start、_end位于/u-boot-1.1.6/board/xxx(开发板目录名称)
/u-boot.lds文件里,具体值是由编译器算出来的。
继承事业,薪火相传
返回列表