一
关于异常,在ARM Architecture Reference Manual.pdf中,描述如下
其大意是:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。(也就是中断)
二
异常共7种:
当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址即上图的Normal address或者High vector address 处去执行异常处理程序,而这个固定的地址,就称之为异常向量。
注意:具体是Normal address还是High vector address 是和CP15协处理器有关,默认是Normal address,当配置为高位时,跳转到High vector address。
三
所谓的异常向量表,是指由7个异常向量及其处理函数跳转关系组成的表:
0x00000000: b reset
0x00000004: ldr pc, _undefined_instruction
0x00000008: ldr pc, _software_interrupt
0x00000008: ldr pc, _software_interrupt
0x0000000c: ldr pc, _prefetch_abort
0x00000010: ldr pc, _data_abort
0x00000014: ldr pc, _not_used
0x00000018: ldr pc, _irq
0x0000001c: ldr pc, _fiq
注意:0x00000014 这个地址没有使用
四
下面贴出代码,主要有三个 start.S gboot.lds Makefile
start.S
@****************************
@name: start.S
@by : stone
@time: 2016.6.23
@function: 异常向量表
@****************************
.text
.global _start @将_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: @reset
nop
gboot.lds
/***********************
*name : gboot.lds
*by : stone
*time : 2016/06/23
*function : 链接器脚本
***********************/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS {
. = 0x50008000; /*6410的内存起始地址*/
. = ALIGN(4);
.text : /*代码段*/
{
start.o (.text)
*(.text)
}
. = ALIGN(4);
.data : /*数据段*/
{
*(.data)
}
. = ALIGN(4);
bss_start = .;
.bss : /*bss段*/
{
*(.bss)
}
bss_end = .;
}
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
菜鸟一枚,如有错误,多多指教。。。