- 求职 : 系统工程师等
- 论坛徽章:
- 5
|
entry_32.S里的部分汇编:- .section .rodata,"a"
- ENTRY(interrupt)
- .text
- ENTRY(irq_entries_start)
- RING0_INT_FRAME
- vector=0
- .rept NR_IRQS
- ALIGN
- .if vector
- CFI_ADJUST_CFA_OFFSET -4
- .endif
- 1: pushl $~(vector)
- CFI_ADJUST_CFA_OFFSET 4
- jmp common_interrupt
- .previous
- .long 1b
- .text
- vector=vector+1
- .endr
- END(irq_entries_start)
复制代码 主要有两个疑问:
1、因为1b是指向前面代码段:1:push这行的。所以网上都说interrupts是数组,每一项指向:
1: pushl $~(vector)
CFI_ADJUST_CFA_OFFSET 4
jmp common_interrupt
这样的代码段。
那么数据段与代码段是如何布局的?只有一种可能可以解释(用code代表上述代码段,data代表long 1b这个数据):
1:code0
data0
1:code1
data1
1:code2
data2
不知道我理解是否正确?
2、这段汇编无疑定义了interrupts数组,但是我在irqinit_64.c里也定义了interrupts数组:- static void (*__initdata interrupt[NR_VECTORS - FIRST_EXTERNAL_VECTOR])(void) = {
- IRQLIST_16(0x2), IRQLIST_16(0x3),
- IRQLIST_16(0x4), IRQLIST_16(0x5), IRQLIST_16(0x6), IRQLIST_16(0x7),
- IRQLIST_16(0x8), IRQLIST_16(0x9), IRQLIST_16(0xa), IRQLIST_16(0xb),
- IRQLIST_16(0xc), IRQLIST_16(0xd), IRQLIST_16(0xe), IRQLIST_16(0xf)
- };
复制代码 为什么定义两个地方呢?是不是64位的用.c的定义,32位的用之前汇编里的定义?
谢谢!
|
|