AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 535199
Accepted
Stefan
Stefan
Asked: 2019-08-13 07:48:31 +0800 CST2019-08-13 07:48:31 +0800 CST 2019-08-13 07:48:31 +0800 CST

如何从中断的数量推断出中断的性质?

  • 772

我正在尝试使用较旧的 PC ( HP Pavilion Elite m9660de ) 启动/安装 Linux 以进行学习。以下消息是启动时显示的第一件事(Ubuntu 和 Fedora,都来自可启动的 U 盘和全新安装):

do_IRQ: 1.55 没有向量的 irq 处理程序

do_IRQ: 2.55 没有向量的 irq 处理程序

do_IRQ: 3.55 没有向量的 irq 处理程序

引导过程将在那里停顿很长时间(如 15 分钟),然后最终继续。


我不是要求获得对这个具体问题的支持,而是要了解如何解释这样的信息。

我在 do_IRQ 的内核代码中发现 55 是一个向量。据我了解,这或多或少是中断的编号,对应于包含中断处理程序地址的内存位置。

我原以为这些数字与导致中断的事件之间存在固定的对应关系。我在哪里可以找到这方面的文档?这是特定于 Linux、特定于处理器还是特定于主板?

linux-kernel interrupt
  • 1 1 个回答
  • 5140 Views

1 个回答

  • Voted
  1. Best Answer
    telcoM
    2019-08-14T03:13:43+08:002019-08-14T03:13:43+08:00

    do_IRQ: 1.55 没有向量的 irq 处理程序

    此消息可以在 Linux 内核源文件中找到arch/x86/kernel/irq.c,因此它是关于特定于 x86 的中断处理。

    /*
     * do_IRQ handles all normal device IRQ's (the special
     * SMP cross-CPU interrupts have their own specific
     * handlers).
     */
    __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
    {
            struct pt_regs *old_regs = set_irq_regs(regs);
            struct irq_desc * desc;
            /* high bit used in ret_from_ code  */
            unsigned vector = ~regs->orig_ax;
    
            entering_irq();
    
            /* entering_irq() tells RCU that we're not quiescent.  Check it. */
            RCU_LOCKDEP_WARN(!rcu_is_watching(), "IRQ failed to wake up RCU");
    
            desc = __this_cpu_read(vector_irq[vector]);
    
            if (!handle_irq(desc, regs)) {
                    ack_APIC_irq();
    
                    if (desc != VECTOR_RETRIGGERED && desc != VECTOR_SHUTDOWN) {
                            pr_emerg_ratelimited("%s: %d.%d No irq handler for vector\n",
                                                 __func__, smp_processor_id(),
                                                 vector);
                    } else {
                            __this_cpu_write(vector_irq[vector], VECTOR_UNUSED);
                    }
            }
    
            exiting_irq();
    
            set_irq_regs(old_regs);
            return 1;
    }
    

    因此,第一个数字(点之前)是报告处理器的 ID,而 55 是您发现的中断向量。VECTOR_SHUTDOWN如果 IRQ 向量处于状态或,则可以避免该消息VECTOR_RETRIGGERED。

    根据arch/x86/kernel/apic/vector.c状态VECTOR_SHUTDOWN指示有意清除的中断向量(例如,硬件设备已停止并以受控方式卸载其驱动程序)。

    VECTOR_RETRIGGERED设置在末尾fixup_irqs(),arch/x86/kernel/irq.c似乎与 CPU 热插拔有关,或者更具体地说,将 CPU 标记为脱机。

    因此,这些状态都不应该在启动时适用于普通 PC。

    您关于中断向量编号和中断原因之间的固定对应关系的想法对于原始 IBM PC 的 ISA 总线体系结构是有效的……并且在那之后的很长一段时间内。

    但是在 486 处理器和第一代 Pentium 时代的某个地方,引入了 APIC(高级可编程中断控制器)。它是使多个处理器在 PC 架构中共存的组件之一。它开辟了将可用硬件中断线的数量从 15 条(第一个 IBM PC-AT 中的一对 8259 中断控制器)增加到 224 个离散硬件中断的途径。这使得设计更复杂的系统成为可能,也有助于实现真正的自动配置总线。

    本质上,系统固件或操作系统都应该将总线上的设备配置为使用特定的中断线,然后对 APIC 进行编程以将中断信号路由到 CPU 中的可用中断向量。这需要了解总线在主板上的实际接线方式,因此实际上这几乎完全由系统固件完成,许多例外情况都是专门修补固件错误。

    PCI 总线最初将其中断映射到 ISA 样式的中断,但是当 APIC 集成到 CPU 中时,可以消除此限制,从而减少 IRQ 延迟并允许构建更复杂的系统。在 PCI 总线 2.2 版中,引入了消息信号中断 (MSI),它允许在没有专用物理中断线的情况下实现离散硬件中断。在 PCI Express 中,MSI 成为处理中断的标准方式。

    所以...看起来您的系统硬件包含路由到 IRQ 向量 55 的活动中断源,但 Linux 目前没有加载驱动程序来处理它。由于 PCI 配置空间以标准方式可读并且 Linux 确实可以读取它,因此应该检测、识别 PCI 总线(或 PCIe 链路)上的任何设备,并且应该知道它们的中断配置。

    也可能是 IRQ 的来源不是 PCI 设备,即平台设备,例如系统芯片组的一部分或使用某些非 PCI 兼容接口连接到它们的东西。所有这些设备都应该由固件 ACPI 表来描述......但显然在你的情况下,这些 IRQ 的这个来源不是。

    我的结论是,这可能是一个固件错误:看看 HP 是否为您的系统提供 BIOS 更新。(此时,HP 对 Pavilion Elite m9660de 的支持下载页面似乎无法为我加载。)

    根据Ubuntu 论坛中的这个帖子,它也可能是 VIA 芯片组中的硬件错误:如果您的系统有这个芯片组,在 GRUB 中添加引导选项pci=nomsi,noaer可能会修复它。

    如果您当前的内核debugfs支持并启用了 CONFIG_GENERIC_IRQ_DEBUGFS 内核选项,您可能会以 root 身份使用以下命令获得有关 IRQ 向量 55 状态的大量信息:

    mount -t debugfs none /sys/kernel/debug
    grep "Vector.*55" /sys/kernel/debug/irq/irqs/*
    

    这应该告诉您该目录中的哪些文件提到“Vector:55”。阅读这些文件应该基本上告诉您内核所知道的有关该中断向量的所有信息。

    • 7

相关问题

  • 如何让我的帧缓冲控制台工作?

  • 阻止挂载系统调用

  • 为什么无线工具版本 30 成为永久测试版?

  • 程序堆栈大小

  • 哪些 802.11ac(或更高版本)WiFi 加密狗适用于 Linux 4.13 内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve