2、谁来唤醒我
在上一节的u-boot.lds文件中有这样一句是:
cpu/arm_cortexa8/start.o (.text)
这句话就是调用初始化代码stat.s的元老级功臣,这可和神话中的女娲、盘古之类的有得一拼的,只是那时代没有计算机,要不还真得一较高低才行。说远了,回归主题,话说从这里调用并执行start.s文件后,该文件又是如何执行的呢?
2.1、天生我才必有用
start.s是就是所谓启动的第一阶段,其主要功能如下:
(1)定义入口。由于一个可执行的image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在rom(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2)设置异常向量(exception vector)。
(3)设置CPU的速度、时钟频率及中断控制寄存器。
(4)初始化内存控制器 。
(5)将rom中的程序复制到ram中。
(6)初始化堆栈 。
(7)转到ram中执行,该工作可使用指令ldr pc来完成。
2.2、出问题了?相信表哥
怎么不是相信春哥得永生呢?其实我也这么想的,关键是程序不认识春哥呀,这个傻不啦叽的家伙只认识表哥呀,当然这里可不是你的表哥哟,所谓的表即“异常向量表”,明白了吧,关键时候还得看表哥的。
系统上电后,pc指针从0x00000000地址开始执行,这个地址是处理器可以直接访问的,所以这个时候不要指望能运行到你的外存上,实际上现在还在内部flash中,就是所谓的nor flash。所以,我们就要在0x00000000位置放置有意义的东西,不然系统怎么启动呢?废话少说,直接看下面的代码再作解释:
.globl _start
_start: b start_code
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
该部分为处理器的异常处理向量表。地址范围为0x0000 0000 ~ 0x0000 0020,刚好8条指令,在ARM的异常向量表(如下表所示):
中断向量地址 | 异常中断类型 | 异常中断模式 | 优先级(6最低) |
0x00 | 复位 | 特权模式 | 1 |
0x04 | 未定义的指令 | UND终止模式 | 6 |
0x08 | 软件中断 | 特权模式 | 6 |
0x0C | 指令预取终止 | 终止模式 | 5 |
0x10 | 数据访问终止 | 终止模式 | 2 |
0x14 | 保留 | 未使用 |