u-boot1.1.6启动过程分析-异常向量表

Posted petewell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了u-boot1.1.6启动过程分析-异常向量表相关的知识,希望对你有一定的参考价值。

前言

根据u-boot1.1.6的编译过程可以得知,u-boot启动执行的第一个代码是cpu/arm920t/start.S,下面就从这个文档开始吧。

.globl _start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt /* 0x00000008软中断异常 */
ldr pc, _prefetch_abort /* 0x0000000c预取异常 */
ldr pc, _data_abort /* 0x00000010数据异常 */
ldr pc, _not_used /* 0x00000014 */
ldr pc, _irq /* 0x00000018外部中断异常 */
ldr pc, _fiq /* 0x0000001c快速中断异常 */

_undefined_instruction: 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



.align 5
undefined_instruction:
get_bad_stack
bad_save_user_regs
bl do_undefined_instruction

.align 5
software_interrupt:
get_bad_stack
bad_save_user_regs
bl do_software_interrupt

.align 5
prefetch_abort:
get_bad_stack
bad_save_user_regs
bl do_prefetch_abort

.align 5
data_abort:
get_bad_stack
bad_save_user_regs
bl do_data_abort

.align 5
not_used:
get_bad_stack
bad_save_user_regs
bl do_not_used

.align 5
irq:
/* add by www.100ask.net to use IRQ for USB and DMA */
sub lr, lr, #4 @ the return address
ldr sp, IRQ_STACK_START @ the stack for irq
stmdb sp!, r0-r12,lr @ save registers

ldr lr, =int_return @ set the return addr
ldr pc, =IRQ_Handle @ call the isr
int_return:
ldmia sp!, r0-r12,pc ^ @ return from interrupt

.align 5
fiq:
get_fiq_stack
/* someone ought to write a more effiction fiq_save_user_regs */
irq_save_user_regs
bl do_fiq
irq_restore_user_regs

异常

异常其实是中断的一种,我们的中断按中断事件来源进行分类,主要有两类:

  • 中断:由CPU以外的事件引起的中断,如I/O中断、时钟中断、控制面板中断等。
  • 异常:来自CPU的内部事件或进程执行中的事件引起的过程。如由于CPU本身故障、进程故障和请求系统服务的命令引起的中断等。

异常向量表

当异常发生的时候,由硬件机制处理器自动的跳到一个固定地址去执行相关异常处理进程,而这个固定地址就是所谓的异常向量。

启动方式与异常向量表

Nor Flash方式

Nor Flash的地址范围为0x00000000—0x08000000,片内SRAM地址被置为0x40000000—0x4000DFFF,由于Nor Flash可以直接运行代码,因此中断向量表存放在0x00000000开始的8×4大小的空间中。中断产生时,PC被置为相对应的向量地址。如上电或者按Reset键时,PC直接置为0x00,从NOR FLASH的0x00处开始执行。

NAND Flash方式

片内的BootSRAM地址被置为0x00000000—0x08000000,NAND Flash地址接NFCE,由于NAND FLASH不能运行代码,系统上电或者Reset的时候,内置的NAND FLASH 将访问控制接口,并将中断向量表和引导代码自动加载到片内SRAM,并且置PC值为0x00运行进程,这一切是有芯片内部的硬件逻辑完成的。

原文引用 大专栏  https://www.dazhuanlan.com/2019/08/27/5d64c67cd7735/


以上是关于u-boot1.1.6启动过程分析-异常向量表的主要内容,如果未能解决你的问题,请参考以下文章

u-boot start.S启动文件分析

Tiny4412 u-boot分析u-boot启动流程

ARM64的启动过程之:异常向量表的设定

嵌入式Linux9.U-Boot启动流程详解

Linux嵌入式驱动学习之路⑤u-boot启动流程分析

u-boot-201611 启动过程分析——基于smdk2410