免费注册 查看新帖 |

Chinaunix

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

高手帮忙解释下,linux内核entry_32.S中断处理函数数组interrupt的初始化? [复制链接]

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:09
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-26 08:37 |只看该作者 |倒序浏览
.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才对吧,但是程序中就没看出来。
哪位高手能帮忙解释一下,非常感谢!

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
2 [报告]
发表于 2012-08-26 14:40 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP