免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1793 | 回复: 2
打印 上一主题 下一主题

[中断] x86架构中,外部中断的服务程序是什么时候注册的. [复制链接]

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-26 17:59 |只看该作者 |倒序浏览

   我看了中断vector注册到IDT表中的函数,native_init_IRQ()
218 void __init native_init_IRQ(void)
219 {
220         int i;
221
222         /* Execute any quirks before the call gates are initialised: */
223         x86_init.irqs.pre_vector_init();/*初始化ISA相关的irq对应的irq_desc,绑定这些irq_desc和i8259A中断控制器>    以及handle_level_irq流控函数.见init_ISA_irqs*/
224
225         apic_intr_init();/*为smp相关的IPI/THERMAL/MCE等,在IDT表中申请vector,并设置相应的服务程序*/            
226   
227         /*               
228          * Cover the whole vector space, no vector can escape
229          * us. (some of these will be overridden and become
230          * 'special' SMP interrupts)
231          *//*遍历所有外部中断的vector..*/
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         }
        ...

      在这里,外部中断的中断服务程序是通过使用interrupt[]指针数组指向的函数来设置.但我查找了x86的源码,只在arch/x86/include/asm/hw_irq.h
中找到一个这样的一个定义:
        extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECOTR])(void);

      
      这个interrupt[]函数指针数组是在什么时候初始化的?? 这里引用哪里的函数指针数组?

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
2 [报告]
发表于 2014-03-26 19:49 |只看该作者
你找本源码分析的书看看,或都百度一下就行了,要学会处理问题的流程,先问google和百度,再发贴。
interrupt是在汇编里头定义的,X86有中断了,会先到汇编。他的定义在arch/x86/kernel/entry_32.S里,下面的代码是2.6.34.10的:
  1. .section .init.rodata,"a"
  2. ENTRY(interrupt)
  3. .text
  4.         .p2align 5
  5.         .p2align CONFIG_X86_L1_CACHE_SHIFT
  6. ENTRY(irq_entries_start)
  7.         RING0_INT_FRAME
  8. vector=FIRST_EXTERNAL_VECTOR
  9. .rept (NR_VECTORS-FIRST_EXTERNAL_VECTOR+6)/7
  10.         .balign 32
  11.   .rept        7
  12.     .if vector < NR_VECTORS
  13.       .if vector <> FIRST_EXTERNAL_VECTOR
  14.         CFI_ADJUST_CFA_OFFSET -4
  15.       .endif
  16. 1:        pushl $(~vector+0x80)        /* Note: always in signed byte range */
  17.         CFI_ADJUST_CFA_OFFSET 4
  18.       .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6
  19.         jmp 2f
  20.       .endif
  21.       .previous
  22.         .long 1b
  23.       .text
  24. vector=vector+1
  25.     .endif
  26.   .endr
  27. 2:        jmp common_interrupt
  28. .endr
  29. END(irq_entries_start)

  30. .previous
  31. END(interrupt)
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-03-26 19:52 |只看该作者
arch/x86/kernel/entry_32.S:
  1. ENTRY(interrupt)
  2. .text
  3.         .p2align 5
  4.         .p2align CONFIG_X86_L1_CACHE_SHIFT
  5. ENTRY(irq_entries_start)
  6.         RING0_INT_FRAME
  7. vector=FIRST_EXTERNAL_VECTOR
  8. .rept (NR_VECTORS-FIRST_EXTERNAL_VECTOR+6)/7
  9.         .balign 32
  10.   .rept        7
  11.     .if vector < NR_VECTORS
  12.       .if vector <> FIRST_EXTERNAL_VECTOR
  13.         CFI_ADJUST_CFA_OFFSET -4
  14.       .endif
  15. 1:        pushl $(~vector+0x80)        /* Note: always in signed byte range */
  16.         CFI_ADJUST_CFA_OFFSET 4
  17.       .if ((vector-FIRST_EXTERNAL_VECTOR)%7) <> 6
  18.         jmp 2f
  19.       .endif
  20.       .previous
  21.         .long 1b
  22.       .text
  23. vector=vector+1
  24.     .endif
  25.   .endr
  26. 2:        jmp common_interrupt
  27. .endr
  28. END(irq_entries_start)

  29. .previous
  30. END(interrupt)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP