Linux内核如何处理中断Linux内核如何处理中断Linux内核如何处理中断Linux内核如何处理中断
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux内核如何处理中断

中断是计算机处理数据的关键部分。

中断是现代 CPU 工作方式的重要组成部分。例如,每次按下键盘上的一个键,CPU 就会被中断,以便 PC 可以从键盘读取用户输入。这种情况发生得如此之快,以至于您不会注意到用户体验有任何变化或损害。

此外,键盘并不是唯一可能导致中断的组件。一般来说,有三种类型的事件可以导致CPU中断:硬件中断、软件中断和异常。在讨论不同类型的中断之前,我将定义一些术语。

定义

中断请求(IRQ)由可编程中断控制器(PIC)请求,目的是中断CPU并执行中断服务程序(ISR)强>)。 ISR 是一个小程序,根据 IRQ 的原因处理某些数据。正常处理会被中断,直到 ISR 完成。

过去,IRQ 由单独的微芯片(PIC)处理,并且 I/O 设备直接连接到 PIC。 PIC 管理各种硬件 IRQ,并可以直接与 CPU 通信。当 IRQ 发生时,PIC 将数据写入 CPU 并拉高中断请求 (INTR) 引脚。

如今,IRQ 由高级可编程中断控制器 (APIC) 处理,该控制器是 CPU 的一部分。每个内核都有自己的 APIC。

中断类型

正如我所提到的,根据中断源可以将中断分为三种类型:

硬件中断

当硬件设备想要告诉 CPU 某些数据已准备好处理时(例如,键盘输入或数据包到达网络接口时),它会发送 IRQ 来向 CPU 发送数据可用的信号。这会调用设备驱动程序在内核启动期间注册的特定 ISR。

软件中断

当您播放视频时,必须同步音乐和视频播放,以便音乐的速度不会发生变化。这是通过精确定时器系统(称为 jiffies)重复触发的软件中断来完成的。该计时器使您的音乐播放器能够同步。软件中断也可以由特殊指令调用来读取或写入数据到硬件设备。

当需要实时功能时(例如在工业应用中),软件中断也至关重要。您可以在 Linux 基金会的文章面向嵌入式开发人员的实时 Linux 简介中找到更多相关信息。

例外情况

异常是您可能了解的中断类型。当 CPU 执行的命令会导致被零除或页面错误时,任何其他执行都会被中断。在这种情况下,您将通过弹出窗口或在控制台输出中看到分段错误(核心转储)来通知您。但并非所有异常都是由错误指令引起的。

异常可以进一步分为故障、陷阱和中止。

  • 故障:故障是系统可以纠正的异常,例如,当进程尝试从交换到硬盘驱动器的内存页面访问数据时。请求的地址在进程地址空间内,并且访问权限正确。如果 RAM 中不存在该页面,则会引发 IRQ,并启动页面错误异常处理程序以将所需的内存页面加载到 RAM 中。如果操作成功,则继续执行。
  • 陷阱:陷阱主要用于调试。如果在程序中设置断点,则会插入一条特殊指令,使其触发陷阱。陷阱可以触发上下文切换,允许调试器读取和显示局部变量的值。之后可以继续执行。 陷阱也是执行系统调用(例如终止进程)的默认方式。
  • 中止:中止是由硬件故障或系统表中的值不一致引起的。中止不会报告导致异常的指令的位置。这些是最关键的中断。中止会调用系统的中止异常处理程序,该处理程序会终止导致该异常的进程。

亲自动手

IRQ 按 APIC 上向量中的优先级排序(0=最高优先级)。前 32 个中断 (0–31) 具有由 CPU 指定的固定顺序。您可以在 OsDev 的异常页面上找到它们的概述。后续的 IRQ 可以进行不同的分配。中断描述符表(IDT)包含 IRQ 和 ISR 之间的分配。 Linux 定义了一个从 0 到 256 的 IRQ 向量来进行分配。

要打印系统上已注册中断的列表,请打开控制台并键入:

cat /proc/interrupts

你应该看到这样的东西:

内核版本 5.6.6 中注册的中断。 (斯蒂芬·阿文维德,CC BY-SA 4.0)

从左到右,各列分别是:IRQ 向量、每个 CPU 的中断计数 (0 .. n)、硬件源、硬件源的通道信息以及导致 IRQ 的设备名称。

在表格的底部,有一些非数字中断。它们是特定于体系结构的中断,例如 IRQ 236 上的本地计时器中断 (LOC)。其中一些中断在 Linux 内核源代码树的 Linux IRQ 向量布局中指定。

特定于架构的中断(Stephan Avenwedde,CC BY-SA 4.0)

要获得该表的实时视图,请运行:

watch -n1 "cat /proc/interrupts"

结论

正确的 IRQ 处理对于硬件、驱动程序和软件的正确交互至关重要。幸运的是,Linux 内核做得非常好,普通 PC 用户几乎不会注意到内核的整个中断处理。

这可能会变得非常复杂,本文仅对该主题进行简要概述。 Linux Inside 电子书 (CC BY-NC-SA 4.0) 和 Linux 内核教学存储库是深入研究该主题的良好信息来源。

©2015-2025 艾丽卡 support@alaica.com