深入解析 ARM64 SOC RK3568的 /proc/interrupts 输出

在 Linux 系统中,/proc/interrupts 文件提供了系统中断的详细信息,是性能分析和故障排除的重要工具。本文将重点解析 RK3568环境下该文件的输出格式及其背后的结构。

什么是 /proc/interrupts

/proc/interrupts 文件记录了所有中断的信息,包括每个中断在各个 CPU 上的触发次数、对应的中断源以及中断控制器类型等。这些信息对于调试和优化系统性能至关重要。它定义在fs/proc/interrupts.c文件中,#cat /proc/interrupts会触发函数show_interrupts来完成打印输出。

# cat /proc/interrupts
           CPU0       CPU1       CPU2       CPU3
  5:      78720      81935      81943      77682     GICv3  26 Level     arch_timer
  6:          0          0          0          0     GICv3 141 Level     rk_timer
  7:          0          0          0          0     GICv3 260 Level     arm-pmu
  8:          0          0          0          0     GICv3 261 Level     arm-pmu
  9:          0          0          0          0     GICv3 262 Level     arm-pmu
 10:          0          0          0          0     GICv3 263 Level     arm-pmu
 11:          0          0          0          0     GICv3 128 Level     ahci[fc800000.sata]
 12:          0          0          0          0     GICv3 162 Level     ehci_hcd:usb1
 13:          0          0          0          0     GICv3 163 Level     ohci_hcd:usb3
 14:          2          0          0          0     GICv3 165 Level     ehci_hcd:usb2
 15:         33          0          0          0     GICv3 166 Level     ohci_hcd:usb4
 16:        443          0          0          0     GICv3  78 Level     fdd40000.i2c
 17:          0          0          0          0     GICv3 183 Level     fde4b000.iommu, fde40000.npu
 18:        504          0          0          0     GICv3  71 Level     fde60000.gpu
 19:          0          0          0          0     GICv3  73 Level     fde60000.gpu
 20:        308          0          0          0     GICv3  72 Level     fde60000.gpu
 21:          0          0          0          0     GICv3 171 Level     fdea0400.vdpu
 22:          0          0          0          0     GICv3 170 Level     fdea0800.iommu
 23:          0          0          0          0     GICv3 122 Level     rga
 24:          0          0          0          0     GICv3  94 Level     fded0000.jpegd
 25:          0          0          0          0     GICv3  93 Level     fded0480.iommu
 26:          0          0          0          0     GICv3  96 Level     fdee0000.vepu
 27:          0          0          0          0     GICv3  95 Level     fdee0800.iommu
 28:          0          0          0          0     GICv3  88 Level     fdef0800.iommu, fdef0000.iep
 29:          0          0          0          0     GICv3 172 Level     fdf40000.rkvenc
 30:          0          0          0          0     GICv3 173 Level     fdf40f00.iommu
 31:          0          0          0          0     GICv3 174 Level     fdf40f00.iommu
 32:          0          0          0          0     GICv3 123 Level     fdf80200.rkvdec
 33:          0          0          0          0     GICv3 124 Level     fdf80800.iommu
 37:          0          0          0          0     GICv3  91 Level     fdff1a00.iommu
 38:          0          0          0          0     GICv3  64 Level     eth0
 39:          0          0          0          0     GICv3  61 Level     eth0
 40:       1939          0          0          0     GICv3 180 Level     fe043e00.iommu, fe040000.vop
 41:       3856          0          0          0     GICv3  77 Level     fe0a0000.hdmi, dw-hdmi-cec
 42:         62          0          0          0     GICv3 132 Level     dw-mci
 48:          0          0          0          0     GICv3  59 Level     eth1
 49:          0          0          0          0     GICv3  56 Level     eth1
 50:          0          0          0          0     GICv3 130 Level     dw-mci
 51:          0          0          0          0     GICv3 133 Level     rksfc
 52:      28170          0          0          0     GICv3  51 Level     mmc0
 56:        208          0          0          0     GICv3  46 Level     fe530000.dmac
 57:          0          0          0          0     GICv3  45 Level     fe530000.dmac
 58:         25          0          0          0     GICv3  48 Level     fe550000.dmac
 59:          0          0          0          0     GICv3  47 Level     fe550000.dmac
 60:          0          0          0          0     GICv3  34 Level     can0
 61:          0          0          0          0     GICv3  35 Level     can1
 62:          2          0          0          0     GICv3  79 Level     fe5a0000.i2c
 63:          0          0          0          0     GICv3  82 Level     fe5d0000.i2c
 64:         44          0          0          0     GICv3  83 Level     fe5e0000.i2c
 66:        418          0          0          0     GICv3 135 Level     fe610000.spi
 71:          0         11          0          0     GICv3 115 Level     rk_pwm_irq
 74:          0          0          0          0     GICv3 147 Level     rockchip_thermal
 75:        868          0          0          0     GICv3 125 Level     fe720000.saradc
 76:          1          0          0          0     GICv3 167 Level     rockchip_usb2phy
 77:          1          0          0          0     GICv3 168 Level     rockchip_usb2phy
 84:         54          0          0          0     GICv3 150 Level     debug
 85:         53          0          0          0     GICv3 201 Level     dwc3
 86:          0          0          0          0     GICv3 202 Level     xhci-hcd:usb5
 87:          0          0          0          0     gpio0   3 Level     rk817
 88:          0          0          0          0     rk817   0 Edge      rk805_pwrkey_fall
 89:          0          0          0          0     rk817   1 Edge      rk805_pwrkey_rise
112:          0          0          0          0     gpio0  27 Edge      hym8563
113:          0          0          0          0     gpio2  31 Edge      bt_default_wake_host_irq
IPI0:      7129      21830      19937         18       Rescheduling interrupts
IPI1:        50         54         49          7       Function call interrupts
IPI2:         0          0          0          0       CPU stop interrupts
IPI3:         0          0          0          0       CPU stop (for crash dump) interrupts
IPI4:         0          0          0          0       Timer broadcast interrupts
IPI5:      1921       1726       1928          1       IRQ work interrupts
IPI6:         0          0          0          0       CPU wake-up interrupts
Err:          0

输出解析

基本结构

           CPU0       CPU1       CPU2       CPU3
  5:      78720      81935      81943      77682     GICv3  26 Level     arch_timer
  6:          0          0          0          0     GICv3 141 Level     rk_timer
  7:          0          0          0          0     GICv3 260 Level     arm-pmu

列解析

  • 1 中断 ID
    • 每一行的第一列是Linux中断的编号,作为索引用于访问 irq_desc。在内核代码中经常以变量名virq出现。
  • 2 CPU 列
    • 每一列表示一个 CPU 的中断计数,对应于 irq_desc.kstat_irqs 成员,显示该中断在各个 CPU 上的触发次数。
  • 3 中断控制器类型
    • 输出中的 GICv3 表示使用的中断控制器为 GICv3(通用中断控制器版本 3),对应irq_desc->irq_data.chip->name。
  • 4 中断源编号
    • 每行中的数字(如 26165)是硬件中断请求编号(hwirq),对应desc->irq_data.hwirq
  • 5 中断类型
    • Level 表示中断的触发方式为电平触发,来自如下输出
irqd_is_level_type(&desc->irq_data) ? "Level" : "Edge"
  • 6 中断名称
    • 最后一列显示中断源的名称,例如 arch_timer 或 ehci_hcd:usb2,对应于 irq_desc.name 成员。

IPI(Inter-Processor Interrupts)

在输出中可能还会看到 IPI(Inter-Processor Interrupts)相关的行,这些中断用于 CPU 之间的通信,通常会单独列出。

IPI0:      7129      21830      19937         18       Rescheduling interrupts
IPI1:        50         54         49          7       Function call interrupts
IPI2:         0          0          0          0       CPU stop interrupts
IPI3:         0          0          0          0       CPU stop (for crash dump) interrupts
IPI4:         0          0          0          0       Timer broadcast interrupts
IPI5:      1921       1726       1928          1       IRQ work interrupts
IPI6:         0          0          0          0       CPU wake-up interrupts

按中断类型划分

在 ARM64 架构中,中断主要分为四类:

  • SGI (Software Generated Interrupts):
    • SGI 是由软件产生的中断,通常用于进程间通信(IPC)或特定的系统调用。当某个进程需要通知另一个进程时,可以触发 SGI。GIC V3中SGI范围是0~15。在Linux中,定义IPI 是核心之间的中断IPI,使用SGI来实现,例如
IPI0:      7129      21830      19937         18       Rescheduling interrupts
IPI1:        50         54         49          7       Function call interrupts
  • PPI (Private Peripheral Interrupts):
    • PPI 是特定于 CPU 的中断,通常用于处理某个特定硬件设备的请求。这些中断一般不会被其他 CPU 共享,通常用于较为私有的设备,如定时器或某些内部设备。虽然 PPI 在输出中没有特别标记,但可以通过硬件中断号来推测其类型。GIC V3中PPI范围是16~31。例如上面的arch_timer的硬件中断号是26,就是PPI。
           CPU0       CPU1       CPU2       CPU3
  5:      78720      81935      81943      77682     GICv3  26 Level     arch_timer
  • SPI (Shared Peripheral Interrupts):
    • SPI 是多个设备共享的中断,通常由外部设备通过中断控制器发送。共享中断允许多个设备使用同一个中断线,从而节省资源。SPI 的中断源通常在输出中直接显示设备名称,例如 USB 控制器或网络接口卡。GIC V3中SPI硬件中断号的范围是32~1019。例如上面的ehci_hcd:usb1的硬件中断号是162,就是SPI。
           CPU0       CPU1       CPU2       CPU3 
12:          0          0          0          0     GICv3 162 Level     ehci_hcd:usb1
  • LPI(Locality-specific Peripheral Interrupts) 
    • LPI 是一种使用消息机制和边沿触发的中断。例如当 PCIe 设备需要中断 CPU 时,它会通过 MSI(Message Signaled Interrupts) 机制发送中断信号,通常是写入特定内存地址。ITS 将接收到的 MSI 中断请求解析,并将其转换为 LPI。转换后的 LPI 被发送到相应的 Redistributor,最终,处理器核心接收到 LPI。GIC V3中LPI硬件中断号的范围是大于等于8192。显然,上面RK3568的输出,没有LPI中断。

共同成长,感谢点赞关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值