start.S解析
首先是头文件包含
#
include
<config.h>
#
include
<version.h>
#
if
defined(CONFIG_ENABLE_MMU)
#
include
<asm/proc/domain.h>
#endif
#
include
<regs.h>
#ifndef CONFIG_ENABLE_MMU
#ifndef CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
#endif
#endif
config.h是在配置时生成的文件,里面包含的是linux/autoconf.h,在mkconfig文件中可以看到生成的指令,内部包含板子的型号等参数。
version.h是uboot版本号,由Makefile生成。
asm/proc/domain.h不是uboot的原生目录,是配置时创建的符号链接,实际指向asm-arm/proc-armv/domain.h
regs.h也是配置时生成的,实际为s5pc110.h
上面两个目录这样配置是为了增强可移植性。
接着定义两个宏 CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE 为uboot的物理地址,CFG_UBOOT_BASE地址为0x33e00000
#
if
defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
.word
0x2000
.word
0x0
.word
0x0
.word
0x0
#endif
宏CONFIG_EVT1已经被定义了,后面定义4个字,由于210是32位,所以一个字就是4个字节。这里定义4个字是为了填充uboot前16字节,因为210sd卡启动时会有16B的校验头,所以这里预先填充16字节的数据,以后计算校验头的时候直接覆盖前16字节。
.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
start.S的开始,这里虽然定义了异常向量表,但是由于uboot主要是用作启动,运行过程很短,所以基本不会用到。
开头的 b reset 跳转到reset,reset就是代码真正有意义的起始位置。 构建异常向量表
.global _end_vect
_end_vect:
.balignl
16
,
0xdeadbeef
这里定义了结束时候的动作,
.balignl是为了字节对齐,后面第一个参数表示16字节对齐,第二个参数表示填充内容,当地址偏移4个地址就填充0xdeadbeef,直到地址16字节对齐为止。0xdeadbeef本身没有别的意思,只是十六进制的数刚好组成了两个单词,坏牛肉,意思就是没用的东西,用来填充内存的。
_TEXT_BASE:
.word TEXT_BASE
/*
* 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:
.word CFG_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