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