当桥片2H上的键盘触发一个中断后,是怎么显示到cpu上的?这个硬件路是怎么走的呢? 1)置位2H上的中断控制器的对应位 2)cpu核2H是由HT连接的,所以中断会再HT的中断控制器上把对应位ie置位 3)HT对应cpu的cause寄存器中断IP2位,此时IP2位置位,告诉cpu一个中断来了
当cpu知道一个中断来了之后,要怎么进行分发呢? 先看一下vxWorks中关于中断控制器的嵌套使用: 这里呢把有四个中断控制器,但分别是嵌套的。
const struct intrCtlrInputs mipsIntCtlr0Inputs[] = { /* pin, driver, unit, index */ {0, "swtrap", 0, 0}, {1, "swtrap", 1, 0}, {2, "mipsSbIntCtlr", 0, 0}, {3, "mipsSbIntCtlr", 0, 1}, {4, "mipsSbIntCtlr", 0, 2}, {5, "mipsSbIntCtlr", 0, 3}, {6, "mipsSbIntCtlr", 0, 4}, {7, "r4KTimerDev", 0, 0}, {7, "legacy", 0, 7}, }; 这是第一级中断控制器,对应着cpu的IP0-IP7. const struct intrCtlrInputs mipsSbIntCtlrInputs[] = { /* pin, driver, unit, index */ #ifdef DRV_SIO_NS16550 {LPC_INT, "ns16550", 0, 0}, {LPC_INT, "ns16550", 1, 0}, #endif {HT1_INT0, "mipsLsnIntCtlr", 0, 0}, {HT1_INT0, "mipsLsnIntCtlr", 1, 0}, {K_INT_MBOX_0_0, "ipi", 0, 0}, {K_INT_MBOX_0_1, "ipi", 0, 1}, {K_INT_MBOX_0_2, "ipi", 0, 2}, {K_INT_MBOX_0_3, "ipi", 0, 3}, }; 这里中断的第二级控制器,是由第一级控制器分发下来的,由第一级控制器可以知道当IP2-6置位时,就会分发到这里来,由第二级控制器继续分发或者处理。(这个控制器处理核间中断) const struct intrCtlrInputs mipsLsnIntCtlrInputs0[] = { /* pin, driver, unit, index */ {1, "hpetTimerDev", 0, 0 }, /*2h-hpet*/ {2, "ns16550", 2, 0 }, {3, "ns16550", 3, 0 }, {13, "mipsLsnLpcIntCtlr", 0, 0 }, }; 这就是第三级控制器了,由第二级控制器分发过来,也就是当中断源时HT时,就会分发到这里来。 const struct intrCtlrInputs mipsLsnLpcIntCtlrInputs0[] = { /* pin, driver, unit, index */ {1, "i8042Kbd", 0, 0 }, {12, "i8042Mse", 0, 0 }, }; 这是第三级中断控制器,由第三级控制器分发过来,由第三级控制器可知,当中断来源是引脚13时,就会分发到这里。 这就是软件上定义的四个中断控制器,管理这所有的中断。 当一个ps2键盘中断来了之后处理过程是这样的: 1)cpu上的IP2-6中某一位置位,由控制器mipsIntCtlr0Inputs进行分发 2)之后就中断就分发到了mipsSbIntCtlrInputs控制器 3)之后呢mipsSbIntCtlrInputs判别出中断源是HT,就分发到mipsLsnIntCtlrInputs0控制器 4)mipsLsnIntCtlrInputs0控制器核自己管理的中断源对比后,发现没有匹配的就分发到mipsLsnLpcIntCtlrInputs0 5)mipsLsnLpcIntCtlrInputs0发现自己管理的中断处理i8042Kbd就对应这个中断源,之后进行处理。