Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313802
  • 博文数量: 54
  • 博客积分: 3050
  • 博客等级: 中校
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-25 16:53
文章分类
文章存档

2012年(1)

2011年(7)

2010年(46)

我的朋友

分类: LINUX

2010-01-25 18:43:53

------------------>Part 1: cat /proc/interrupts

文件/proc/interrupts是中断报告文件,可以查看中断发生的次数。
Linux内核通常会在第一个CPU上处理中断,以便最大化缓存本地性

           CPU0       CPU1
  0:         61         20   IO-APIC-edge      timer
  1:       5098       5157   IO-APIC-edge      i8042
  4:          2          2   IO-APIC-edge
  7:          0          0   IO-APIC-edge      parport0
  8:          1          0   IO-APIC-edge      rtc0
  9:          0          0   IO-APIC-fasteoi   acpi
 14:          0          0   IO-APIC-edge      ata_piix
 15:          0          0   IO-APIC-edge      ata_piix
 16:       6121       6216   IO-APIC-fasteoi   uhci_hcd:usb5, HDA Intel, nvidia
 18:          0          0   IO-APIC-fasteoi   uhci_hcd:usb4
 19:     110675     110742   IO-APIC-fasteoi   ata_piix, uhci_hcd:usb3
 23:      26152      25964   IO-APIC-fasteoi   ehci_hcd:usb1, uhci_hcd:usb2
 27:      36191      36157   PCI-MSI-edge      eth0
NMI:          0          0   Non-maskable interrupts
LOC:    2873486    2200162   Local timer interrupts
SPU:          0          0   Spurious interrupts
CNT:          0          0   Performance counter interrupts
PND:          0          0   Performance pending work
RES:       1476       1516   Rescheduling interrupts
CAL:       3593       6329   Function call interrupts
TLB:      16527      25913   TLB shootdowns
TRM:          0          0   Thermal event interrupts
THR:          0          0   Threshold APIC interrupts
MCE:          0          0   Machine check exceptions
                                                                                   1,12          Top
解释如下:
16:       6121       6216   IO-APIC-fasteoi   uhci_hcd:usb5, HDA Intel, nvidia
    中断号16的中断口,在 cpu0 上响应了 6121 个中断,在 cpu1 上响应了 6216 个中断,链接在这个端口的中断链表上设备接口是 IO-APIC-fasteoi,这个中断号是 设备名为 uhci_hcd:usb5, HDA Intel, nvidia 的几个设备共享的。
    在实现上,是这样滴:irq_desc_t 类型的结构体指针数组 irq_desc 的[16]刚好指着 uhci_hcd:usb5, HDA Intel, nvidia 等设备 regisgter 的 irqactoin 结构体。如图:

而接口类型 IO-APIC-fasteoi 的由来和判断,由《linux设备驱动程序》第十章 interrupt 知:
    X86 计算机的 CPU 为中断只提供了两条外接引脚:NMI 和 INTR。其中 NMI 是不可屏蔽中断,它通常用于电源掉电和物理存储器奇偶校验;INTR是可屏蔽中断,可以通过设置中断屏蔽位来进行中断屏蔽,它主要用于接受外部硬件的中断 信号,这些信号由中断控制器传递给 CPU。

常见的中断控制器有两种:

1. 可编程中断控制器8259A

传统的 PIC(Programmable Interrupt Controller)是由两片 8259A 风格的外部芯片以“级联”的方式连接在一起。每个芯片可处理多达 8 个不同的 IRQ。因为从 PIC 的 INT 输出线连接到主 PIC 的 IRQ2 引脚,所以可用 IRQ 线的个数达到 15 个。


2. 高级可编程中断控制器(APIC)

8259A 只适合单 CPU 的情况,为了充分挖掘 SMP 体系结构的并行性,能够把中断传递给系统中的每个 CPU 至关重要。基于此理由,Intel 引入了一种名为 I/O 高级可编程控制器的新组件,来替代老式的 8259A 可编程中断控制器。该组件包含两大组成部分:一是“本地 APIC”,主要负责传递中断信号到指定的处理器;举例来说,一台具有三个处理器的机器,则它必须相对的要有三个本地 APIC。另外一个重要的部分是 I/O APIC,主要是收集来自 I/O 装置的 Interrupt 信号且在当那些装置需要中断时发送信号到本地 APIC,系统中最多可拥有 8 个 I/O APIC。

每个本地 APIC 都有 32 位的寄存器,一个内部时钟,一个本地定时设备以及为本地中断保留的两条额外的 IRQ 线 LINT0 和 LINT1。所有本地 APIC 都连接到 I/O APIC,形成一个多级 APIC 系统。

    判断到底是哪一个,正是查看 /proc/interrupts 文件,如果输出结果中列出了 IO-APIC,说明您的系统正在使用 APIC。如果看到 XT-PIC,意味着您的系统正在使用 8259A 芯片。这里可知道,Ubuntu-9.10 系统使用的是 APIC。

------------------- Part 2:cat /proc/stat

文件/proc/stat纪录一些系统活动的底层统计信息

intr 5167833 5154006 2 0 2 4907 0 2 68 4 0 4406 9291 50 0 0 

第一个数是所有中断的总数, 而其他每一个代表一个单个 IRQ 线, 从中断 0 开始. 所有的计数跨系统中所有处理器而汇总的. 这个快照显示, 中断号 4 已使用 4907 次
我的电脑显示: 明显,是双核的:
cpu  516723 64 36709 2088864 22390 368 292 0 0
cpu0 262145 44 20530 1002081 10525 195 139 0 0
cpu1 254577 19 16179 1086782 11864 173 152 0 0
intr 6728699 88 14724 0 0 4 0 0 0 1 0 0 0 0 0 0 0 14424 0 0 281679 0 0 0 98753 0 0 0 110703 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 34687715
btime 1259661354
processes 4203
procs_running 2
procs_blocked 0
softirq 3659166 0 2679591 27904 125768 90471 27216 168604 814 538798

**************两个文件的区别:

第一,在每个打开和关闭循环, 你可能发现 /proc/stat 比 /proc/interrupts 更加有用.

另一个不同是, interrupts 不是体系依赖的(也许, 除了末尾几行), 而 stat 是; 字段数依赖内核之下的硬件. 可用的中断数目少到在 SPARC 上的 15 个, 多到 IA-64 上的 256个, 并且其他几个系统都不同. 有趣的是要注意, 定义在 x86 中的中断数当前是 224, 不是你可能期望的 16; 如同在 include/asm-i386/irq.h 中解释的, 这依赖 Linux 使用体系的限制, 而不是一个特定实现的限制( 例如老式 PC 中断控制器的 16 个中断源). -------- 这个不是特别明白呢。
阅读(2680) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~