U-Boot完美解读(2)——启动文件start.s解析

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 保留 未使用
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值