start.S解析2

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


前面的部分,讲解了很多配置方面的内容,

在start.S中,包含头文件的作用和配置有关,


条件编译,

是告诉uboot编译过程的,


#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
	.word 0x2000
	.word 0x0
	.word 0x0
	.word 0x0
#endif
if那块相当于是一个地址,

.word相当于int类型,是GNU汇编中的元素,

0x2000是一个值,不过要说的是这个值是不对的,后面还有校验部分会处理,

因此这4个.word定义,就相当于定义了一个数组,

有没有联想到裸机程序中开始的16字节校验头,

这里的填充,是为16字节的校验做准备的,

不过这个值是不对的,

在sd_fusing文件夹下面有对这里进行处理的函数,


异常向量表的构建,也可以叫一级中断向量表,

.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:
	.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
异常向量表示硬件就已经设定好了的,

不过我们软件的设计要配合它,来进行实现,

补充说明一点的是uboot并未像操作系统那样很完善的处理异常,


_end_vect:
	.balignl 16,0xdeadbeef
这句伪指令的作用是让内存对齐,


_TEXT_BASE:
	.word	TEXT_BASE
TEXT_BASE在源代码中找不到,

其实它是配置阶段的,

是链接时指定的uboot的链接地址,

我做个有趣的解释,

int *_TEXT_BASE;

_TEXT_BASE = TEXT_BASE;

别把两个textbase弄混了!





你可能感兴趣的:(嵌入式,uboot,s5pv210,start.s)