《朱老师物联网大讲堂》学习笔记
学习地址:www.zhulaoshi.org
前面的部分,讲解了很多配置方面的内容,
在start.S中,包含头文件的作用和配置有关,
条件编译,
是告诉uboot编译过程的,
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED) .word 0x2000 .word 0x0 .word 0x0 .word 0x0 #endifif那块相当于是一个地址,
.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_BASETEXT_BASE在源代码中找不到,
其实它是配置阶段的,
是链接时指定的uboot的链接地址,
我做个有趣的解释,
int *_TEXT_BASE;
_TEXT_BASE = TEXT_BASE;
别把两个textbase弄混了!