深入解析 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中断。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值