cat /proc/interrupts
读取到的内容从左到右,分别为:1、逻辑中断号,2、中断在各CPU发生的次数,3、中断所属设备类名称,4、硬件中断号,5、中断处理函数。
如下图:
代码实现分析如下红色字体1~ 5 .
489 int show_interrupts(struct seq_file *p, void *v) 490 { 491 static int prec; 492 493 unsigned long flags, any_count = 0; 494 int i = *(loff_t *) v, j; 495 struct irqaction *action; 496 struct irq_desc *desc; 497 498 if (i > ACTUAL_NR_IRQS) 499 return 0; 500 501 if (i == ACTUAL_NR_IRQS) 502 return arch_show_interrupts(p, prec); 503 504 /* print header and calculate the width of the first column */ 505 if (i == 0) { 506 for (prec = 3, j = 1000; prec < 10 && j <= nr_irqs; ++prec) 507 j *= 10; 508 509 seq_printf(p, "%*s", prec + 8, ""); 510 for_each_online_cpu(j) 511 seq_printf(p, "CPU%-8d", j); 512 seq_putc(p, '\n'); 513 } 514 515 irq_lock_sparse(); 516 desc = irq_to_desc(i); 517 if (!desc) 518 goto outsparse; 519 520 raw_spin_lock_irqsave(&desc->lock, flags); 521 for_each_online_cpu(j) 522 any_count |= kstat_irqs_cpu(i, j); 523 action = desc->action; 524 if (!action && !any_count) 525 goto out; 526 527 seq_printf(p, "%*d: ", prec, i); //1、打印逻辑中断号 528 for_each_online_cpu(j) 529 seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); //2、打印中断次数 530 531 if (desc->irq_data.chip) { 532 if (desc->irq_data.chip->irq_print_chip) 533 desc->irq_data.chip->irq_print_chip(&desc->irq_data, p); 534 else if (desc->irq_data.chip->name) 535 seq_printf(p, " %8s", desc->irq_data.chip->name); //3、打印中断名称 536 else 537 seq_printf(p, " %8s", "-"); 538 } else { 539 seq_printf(p, " %8s", "None"); 540 } 541 if (desc->irq_data.domain) 542 seq_printf(p, " %*d", prec, (int) desc->irq_data.hwirq); //4、打印硬件中断号,比如,gpio number 543 #ifdef CONFIG_GENERIC_IRQ_SHOW_LEVEL 544 seq_printf(p, " %-8s", irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge"); //打印中断触发类型 545 #endif 546 if (desc->name) 547 seq_printf(p, "-%-8s", desc->name); 548 549 if (action) { 550 seq_printf(p, " %s", action->name); 551 while ((action = action->next) != NULL) 552 seq_printf(p, ", %s", action->name); //5、打印中断处理函数名称 553 } 554 555 seq_putc(p, '\n'); 556 out: 557 raw_spin_unlock_irqrestore(&desc->lock, flags); 558 outsparse: 559 irq_unlock_sparse(); 560 return 0; 561 } 562