一首先中断向量表定义在哪里?如何加载?
二 中断向量表与中断服务程序
三处理流程
////////////////////////////////////////////////////////////////////////////////////////////////////
一首先中断向量表定义在哪里?__vectors_start
首先中断向量表定义的是什么?定义的就是中断服务程序的跳转指令,因为每个中断向量在向量表中只有一个字节的存储空间,只能存放一条指令,所以通常存放跳转指令,使程序跳转到存储器的其他地方,再执行中断处理。这里cpu就可以找中断服务程序,跳转指令如例如:
LDRPC, =ISR_HANDLER;
或者
指令与不同的cpu平台有关系。
1.1 vector表定义的方式:往往是变量地址:
如 .
.globl __vectors_start 定义__vectors_start符号,这样外部程序可以访问到。entry-armv.S
__vectors_start:
swi SYS_ERROR0
b vector_und + stubs_offset
ldr pc, .LCvswi + stubs_offset
b vector_pabt + stubs_offset
b vector_dabt + stubs_offset
b vector_addrexcptn + stubs_offset
b vector_irq + stubs_offset
b vector_fiq + stubs_offset
ARM的异常处理向量表在entry-armv.S文件中:
1.2 中断向量表 类型
From ARM
.globl __vectors_start 定义__vectors_start符号,这样外部程序可以访问到。
__vectors_start:定义异常(地址逻辑自上而下0x00----0x1c)跟具体的cpu特性有关
ARM( swi SYS_ERROR0 )向量0:reset,但是这里被修改了,如果是cpu跑到了0地址,用软件中断SYS_ERROR0来处理.
THUMB( svc #0 )向量1
THUMB( nop )向量2
W(b) vector_und+ stubs_offset 向量3 #未定义指令异常
W(ldr) pc,.LCvswi + stubs_offset 向量4#软中断
W(b) vector_pabt+ stubs_offset #向量5指令预取异常中断(Prefetch Abort)
W(b) vector_dabt+ stubs_offset #向量6数据中止
W(b) vector_addrexcptn+ stubs_offset #向量7地址异常Thesearen't too critical.
W(b) vector_irq+ stubs_offset #向量8.IRQ(一般中断)
W(b) vector_fiq+ stubs_offset #向量9 FIQ(快速中断)
/*关于.globl指令:
.global/.globl 命令
.global symbol
.global 使得连接程序(ld)能够识别symbl
声明symbol是全局可见的。标号_start是GNU链接器用来指定第一个要执行指令所必须的,同样的是全局可见的(并且只能出现在一个模块中)
例如:
.global_start #定义_start为外部程序可以访问的标签