Linux 内核如何处理中断
创始人
2024-03-02 06:14:22
0

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

中断是现代 CPU 工作方式中重要的部分。例如:当你每次在键盘上按下一个按键后,CPU 会被中断以使得 PC 读取用户键盘的输入。这个过程发生得相当快,以致于在使用体验上你不会感到任何变化或损害。

此外,键盘并不是导致中断的唯一组件。一般来说,有三种类型的事件会导致 CPU 发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前,我需要先定义一些术语。

定义

中断请求 interrupt request (IRQ)是由 可编程的中断控制器 programmable interrupt controlle (PIC)发起的,其目的是为了中断 CPU 和执行 中断服务程序 interrupt service routine (ISR)。中断服务程序(ISR)是一个小的程序,用来处理具体的数据,其具体的处理方式依赖于造成中断请求(IRQ)的原因。之前正在运行的进程在中断服务程序(ISR)运行结束前都会被中断。

在过去,中断请求由单独的芯片处理(中断控制器芯片 PIC),I/O 设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断请求(IRQ),并且可以直接与 CPU 通信。当一个中断请求(IRQ)产生后,中断控制器(PIC)向 CPU 写入数据,并且触发中断请求引脚(INTR)。

现如今,中断请求(IRQ)由 CPU 中的 高级可编程中断控制器 advanced programmable interrupt controller (APIC)部分来处理。每个核中都拥有属于自己的高级可编程中断控制器。

中断的类型

正如我前文中提到的,中断可以根据其来源分为三种类型。

硬件中断

当一个硬件设备想要告诉 CPU 某一需要处理的数据已经准备好后(例如:当键盘被按下或者一个数据包到了网络接口处),它将会发送一个中断请求(IRQ)来告诉 CPU 数据是可用的。接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。

软件中断

当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。这是由软件中断实现的,由精确的计时器系统(称为 jiffies)重复发起的。这个计时器会使得你的音乐播放器同步。软件中断也可以被特殊的指令所调用,来读取或写入数据到硬件设备。

当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍

异常

异常 exception 是你可能之前就知道的中断类型。当 CPU 执行一些将会导致除零或缺页错误的指令时,任何其他运行中的程序都会被中断。在这种情况下,你会被一个弹窗提醒,或在控制台输出中看到** 段错误 segmentation fault ( 核心已转储 core dumped )**。但并不是所有异常都是由指令错误引起的。

异常可以进一步分为 错误 Fault 、 陷阱 Trap 和 终止 Abort 。

  • 错误:错误是系统可以纠正的异常。例如当一个进程尝试访问某个已经被换出到硬盘的页时。当请求的地址在进程的地址空间中,并且满足访问权限时,如果页不在内存(RAM)中,将会产生一个中断请求(IRQ),并开始启用缺页异常处理程序把所需的页加载到内存中。如果操作成功执行,程序将继续运行。
  • 陷阱:陷阱主要用在调试中。如果你在某个程序中设置了一个断点,你就插入了一条可以触发陷阱执行的特殊指令。陷阱可以触发上下文切换来允许你的调试器读取和展示局部变量的值。之后程序可以继续运行。陷阱同样也是运行系统调用的方式(如杀死一个进程)
  • 终止:终止是由系统表中的硬件错误或值不一致而导致的。终止不会报告造成异常的指令的所在位置。这是最严重的中断,终止将会调用系统的终止异常处理程序来结束造成异常的进程。

动手实践

中断请求按照高级可编程中断控制器(APIC)中的优先级高低排序(0是最高优先级)。前 32 个中断(0~31)是由 CPU 指定的固定序列。你可以在 OsDev 异常 页面找到关于它们的概述。随后的中断请求可以以不同的方式进行分配。 中断描述表 interrupt descriptor table (IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。

为了打印出在你的系统中已注册的中断,打开一个终端并输入:

cat /proc/interrupts

你应该会看到类似如下图的结果:

注册的中断列表

内核版本为5.6.6中注册的中断 (Stephan Avenwedde, CC BY-SA 4.0)

从左到右各列的含义依次为:中断向量号、每个 CPU(0~n)中断发生次数、硬件来源、硬件源通道信息、以及造成中断请求的设备名。

在表的末尾,有一些非数字的中断。它们是特定于体系结构的中断,如 本地计时器中断 local timer interrupt (LOC)的中断请求(IRQ)号为 236。其中一些在 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 内核教程 仓库。


via: https://opensource.com/article/20/10/linux-kernel-interrupts

作者:Stephan Avenwedde 选题:lujun9972 译者:萌新阿岩 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

不中断在0上的strlen...
在C语言中,可以使用循环来替代strlen函数,以求得字符串的长度...
2025-01-12 12:31:57
不支持在CPU上使用FP1...
在使用FP16时,如果不支持在CPU上使用,可以改用FP32代替。...
2025-01-12 00:32:07
不同数量的CPU核心用于运...
一种解决方法是使用随机状态种子(random state seed...
2025-01-09 18:31:33
不通过事件调用来中断工作流...
在 Python 中,可以使用多线程或多进程的方式来实现不通过事件...
2025-01-09 03:00:57
不同的Ubuntu版本在C...
要在不同的Ubuntu版本中使用CPU和GPU服务容器,您可以使用...
2025-01-08 20:00:42
不同CPU上的标准数学函数...
针对这个问题,可以使用开源数学库,例如GNU Scientific...
2025-01-08 11:01:54

热门资讯

使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
2024 开年,LLUG 和你... Hi,Linuxer,2024 新年伊始,不知道你是否已经准备好迎接新的一年~ 2024 年,Lin...
Bazzite:专为 Stea... 为 Linux 桌面或者 Steam Deck 做好游戏准备,听起来都很刺激!对于一个专为 Linu...
Motrix:一个漂亮的跨平台... 一个开源的下载管理器,提供了一个简洁的用户界面,同时提供了跨平台操作的所有基本功能。在这里了解关于它...
Bash 脚本中如何使用 he... here 文档 here document (LCTT 译注:here 文档又称作 heredoc ...
使用 dialog 和 jq ... 为何选择文字用户界面(TUI)?许多人每日都在使用终端,因此, 文字用户界面 Text User I...