中断门初始化

MORGAN_ZHANG 2010-07-13 04:48:12
哪位大虾解一下惑?
arch\x86\kernel\Irqinit.c中的第235行的interrupt[]从哪来的?

232 for (i = FIRST_EXTERNAL_VECTOR; i < NR_VECTORS; i++) {
233 /* IA32_SYSCALL_VECTOR could be used in trap_init already. */
234 if (!test_bit(i, used_vectors))
235 set_intr_gate(i, interrupt[i-FIRST_EXTERNAL_VECTOR]);
236 }
...全文
235 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
充电宝111 2010-07-14
  • 打赏
  • 举报
回复
linux下用了一个很巧妙的方法,其实当你的函数名字很类似的时候,都可以用这种方法来做
void (*interrupt[NR_IRQS])(void) = {
IRQLIST_16(0x0),
};
#define IRQLIST_16(x) \
IRQ(x,0), IRQ(x,1), IRQ(x,2), IRQ(x,3), \
IRQ(x,4), IRQ(x,5), IRQ(x,6), IRQ(x,7), \
IRQ(x,8), IRQ(x,9), IRQ(x,a), IRQ(x,b), \
IRQ(x,c), IRQ(x,d), IRQ(x,e), IRQ(x,f)
#define IRQ(x,y) \
IRQ##x##y##_interrupt
宏替换完了以后就是
void (*interrupt[NR_IRQS])(void) = {
IRQ00_interrupt,IRQ01_interrupt,IRQ02_interrupt,IRQ03_interrupt,IRQ04_interrupt,IRQ05_interrupt,
};
Coder_Granger 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cdbdyx 的回复:]

linux下用了一个很巧妙的方法,其实当你的函数名字很类似的时候,都可以用这种方法来做
void (*interrupt[NR_IRQS])(void) = {
IRQLIST_16(0x0),
};
#define IRQLIST_16(x) \
IRQ(x,0), IRQ(x,1), IRQ(x,2), IRQ(x,3), \
IRQ(x,4), IRQ(x,5), IRQ(x,……
[/Quote]

这是cris里的定义,不是x86
iguest 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cdbdyx 的回复:]
linux下用了一个很巧妙的方法,其实当你的函数名字很类似的时候,都可以用这种方法来做
void (*interrupt[NR_IRQS])(void) = {
IRQLIST_16(0x0),
};
#define IRQLIST_16(x) \
IRQ(x,0), IRQ(x,1), IRQ(x,2), IRQ(x,3), \
IRQ(x,4), IRQ(x,5), IRQ(x,6……
[/Quote]


学习
hallowwar 2010-07-14
  • 打赏
  • 举报
回复
学习。
Coder_Granger 2010-07-14
  • 打赏
  • 举报
回复
tselect支持正则表达式,这点很爽哦
Coder_Granger 2010-07-14
  • 打赏
  • 举报
回复
.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)
.previous



vim里可以用 :tselect interrupt查找,
这个不行还有cscope,多个工具配合,总能找得到的.
tselect查找出的第3个候选结果就是你想要的了
  # pri kind tag               file
1 F m interrupt arch/x86/include/asm/kvm.h
struct:kvm_vcpu_events typeref:struct:kvm_vcpu_events::__anon51
} interrupt;
2 F m interrupt arch/x86/include/asm/kvm_host.h
struct:kvm_vcpu_arch typeref:struct:kvm_vcpu_arch::kvm_queued_interrupt
} interrupt;
3 F r interrupt arch/x86/kernel/entry_32.S
ENTRY(interrupt)
4 F r interrupt arch/x86/kernel/entry_64.S
ENTRY(interrupt)
5 F m interrupt drivers/atm/ambassador.h
struct:__anon1988
u32 interrupt;



还是用vim或者emacs吧,毕竟内核开发者们基本都用这两个.
MORGAN_ZHANG 2010-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wenxy1 的回复:]
用source insigth定位一下就知道了,注意用好工具,事半功倍。
我很惊奇有人在 linux GUI上用gedit一个一个文件的看源代码,改源代码也是这样,至少,我会晕倒的。
[/Quote]
你试过了吗?SI并不是万能的
Wenxy1 2010-07-13
  • 打赏
  • 举报
回复
用source insigth定位一下就知道了,注意用好工具,事半功倍。
我很惊奇有人在 linux GUI上用gedit一个一个文件的看源代码,改源代码也是这样,至少,我会晕倒的。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧