- 论坛徽章:
- 2
|
.section .init.rodata,"a"
ENTRY(interrupt)
.text
.p2align 5
.p2align CONFIG_X86_L1_CACHE_SHIFT
ENTRY(irq_entries_start)
RING0_INT_FRAME
vector=FIRST_EXTERNAL_VECTOR
.rept (NR_VECTORS-FIRST_EXTERNAL_VECTOR+6)/7
.balign 32
.rept 7
.if vector < NR_VECTORS
.if vector <> FIRST_EXTERNAL_VECTOR
CFI_ADJUST_CFA_OFFSET -4
.endif
1: pushl $(~vector+0x80) /* Note: always in signed byte range */
CFI_ADJUST_CFA_OFFSET 4
.if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6
jmp 2f
.endif
.previous
.long 1b
.text
vector=vector+1
.endif
.endr
2: jmp common_interrupt
.endr
END(irq_entries_start)
.previous
END(interrupt)
感觉应该是interrupt[] 数组的每一项都是一个中断处理函数的地址,在这里即是.long 1b 就是标号1的地址
当((vector-FIRST_EXTERNAL_VECTOR)%7) <>6 不成立时,不跳到common_interrupt,这样就是6个中断向量跳到common_interrupt,,一个不跳。结果导致有两个中断向量号共用一个common_interrupt,
为什么要这么做?
反汇编entry_32.o后确是看到了只有32个common_interrupt,即每7个中断向量号共用一个common_interrupt. 就更不解了,程序命明明不是这样的???
本来应该是所有的224个中断向量号共用一个common_interrupt才对吧,但是程序中就没看出来。
哪位高手能帮忙解释一下,非常感谢! |
|