当前位置:   article > 正文

设置异常向量表_修改异常向量表

修改异常向量表

异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。
ARM处理器支持的异常类型为:

这里写图片描述

由图可知,ARM处理器支持7种异常类型,分别是重新启动,未定义指令,软中断,预取异常,数据异常,中断,快速中断。
异常向量:当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量。根据上表,可以知道,当发生reset异常时,处理器会跳转到0x00000000这个地址,执行该地址的指令。从图中可以看出,每个异常类型对应有两个地址,普通地址和高位地址。一般情况下,发生异常时处理器会跳转到普通地址执行指令,但也可以通过配置协处理器CP15来使处理器跳转到高位地址。

异常向量表:

这里写图片描述

下面列出设置异常向量表的代码start.S,以及链接脚本gboot.lds,以及makefile(针对芯片2440)
start.S:

.text
.global _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                   

undefined_instruction:
    nop

software_interrupt:
    nop

prefetch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    nop
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

链接脚本gboot.lds:

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS {
    . = 0x30008000;

    . = ALIGN(4);
    .text :
    {
    start.o (.text)
    *(.text)
    }

    . = ALIGN(4);
    .data : 
    {
    *(.data)
    }

    . = ALIGN(4);
    bss_start = .;
    .bss : 
    {
    *(.bss) 
    }
    bss_end = .;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

makefile:

all: start.o 
    arm-linux-ld -Tgboot.lds -o gboot.elf $^
    arm-linux-objcopy -O binary gboot.elf gboot.bin

%.o : %.S
    arm-linux-gcc -g -c $^

%.o : %.c
    arm-linux-gcc -g -c $^

.PHONY: clean
clean:
    rm *.o *.elf *.bin
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

对于2440和6410,有这几个文件已经足够了,但对于210芯片,还需要给BL1添加头信息。
210芯片的BL1前都要添加一个16byte的头信息,这是由一开始就固化在iROM的BL0决定的。iROM的BL0会将BL1拷贝到iRAM,在拷贝完成后BL0会进行一个校验,它会对BL1进行计算,算出一个校验码,并且与BL1中头信息中的校验码进行比对,如果比对成功则表示拷贝成功,BL1才能运行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/973641
推荐阅读
相关标签
  

闽ICP备14008679号