uboot2010-09 arm1176 start.S分析

uboot的start.S是整个uboot的最开始的部分,最近正在学习uboot的移植,开发板是OK6410,使用了uboot中arm1176的start.S,位于arch/arm/cpu/arm1176,对这一文件进行了下简略的分析。


头文件及宏定义部分

/* 
 * config.hinclude目录下,是uboot配置中自动生成的文件,包含了相关配置的
 * 头文件。其中有一句#include <configs/smdk6400.h>,将重要的include/
 * configs/smdk6400.h文件联系了起来.
 */
#include <config.h> 

/* 
 * 包含了include/version_autogenerated.h文件,同样是由Makefile自动生
 * 成的文件,定义了uboot版本号的宏.
 */
#include <version.h>

/* 
 * asm不是uboot的原生目录, 是配置是创建的符号链接, 指向asm-arm, proc指向
 * proc-armv, 实际目录为include/asm-arm/proc-aarmv. 此处说明了配置时创
 * 建符号链接的作用. 这样设计提高了uboot的可移植性, 不同的配置创建的符号链
 * 接也不同.
 */
#ifdef CONFIG_ENABLE_MMU
#include <asm/proc/domain.h>
#endif

#if !defined(CONFIG_ENABLE_MMU) && !defined(CONFIG_SYS_PHY_UBOOT_BASE)
#define CONFIG_SYS_PHY_UBOOT_BASE   CONFIG_SYS_UBOOT_BASE
#endif

代码正文

/*
 *************************************************************************
 *
 * Jump vector table as in table 3.1 in [1]
 *
 *************************************************************************
 */

/* 
 * 开始定义异常向量表, 需要依据CPU手册来设定. 每种异常也都要设定好否则发生对应
 * 异常时会使程序跑飞. uboot中并未细致处理各个异常, 毕竟只是衔接初始化和系统的
 * 一小段时间.
 */
.globl _start
_start: b   reset
#ifndef CONFIG_NAND_SPL
    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:
    .word undefined_instruction
_software_interrupt:
    .word software_interrupt
_prefetch_abort:
    .word prefetch_abort
_data_abort:
    .word data_abort
_not_used:
    .word not_used
_irq:
    .word irq
_fiq:
    .word fiq
_pad:
    .word 0x12345678 /* now 16*4=64 */
#else
    . = _start + 64
#endif

.global _end_vect

/*
 * balignl是一个伪指令, 表示以16字节对齐, 若未对齐以deadbeaf来填充. 
 */
_end_vect:
    .balignl 16,0xdeadbeef
/*
 *************************************************************************
 *
 * Startup Code (reset vector)
 *
 * do important init only if we don't start from memory!
 * setup Memory and board specific bits prior to relocation.
 * relocate armboot to ram
 * setup stack
 *
 *************************************************************************
 */

_TEXT_BASE:
    .word   TEXT_BASE /* TEXT_BASE 是Makefile中指定的程序链接地址: 0x57e00000 */

/*
 * Below variable is very important because we use MMU in U-Boot.
 * Without it, we cannot run code correctly before MMU is ON.
 * by scsuh.
 */
_TEXT_PHY_BASE:
/* 在include/configs/smdk6400.h中定义的内存起始地址, 同样为0x57e00000 */
    .word   CONFIG_SYS_PHY_UBOOT_BASE

.globl _armboot_start
_armboot_start:
    .word _start

/*
 * These are defined in the board-specific linker script.
 */
.globl _bss_start
_bss_start:
    .word __bss_start

.globl _bss_end
_bss_end:
    .word _end

/*
 * the actual reset code
 */

/* 
 * reset部分是uboot启动/复位后真正开始执行的代码, CPU在启动/复位后会首先进
 * 入reset模式, 经中断向量表跳转到此处开始执行.
 */
reset:

/* 
 * 开始操作cpsr寄存机, 将CPU设置为svc 32模式
 */
    mrs r0, cpsr
    bic r0, r0, #0x3f
    orr r0, r0, #0xd3
    msr cpsr, r0

/*
 *************************************************************************
 *
 * CPU_init_critical registers
 *
 * setup important registers
 * setup memory timing
 *
 *************************************************************************
 */
    /*
     * we do sys-critical inits only at reboot,
     * not when booting from ram!
     */
cpu_init_crit:
    /*
     * When booting from 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值