0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核处理中断的类型及过程

如意 来源:Linux中国 作者:Stephan Avenwedde 2020-12-29 15:57 次阅读

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

中断是现代 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 内核教程 仓库。
责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11296

    浏览量

    209358
  • 操作系统
    +关注

    关注

    37

    文章

    6808

    浏览量

    123291
  • 中断
    +关注

    关注

    5

    文章

    898

    浏览量

    41474
  • 异常
    +关注

    关注

    0

    文章

    22

    浏览量

    9223
收藏 人收藏

    评论

    相关推荐

    Linux内核中断设计与实现

    裸机编程中使用中断比较麻烦,需要配置寄存器、使能IRQ等等。而在Linux驱动编程中,内核提供了完善的终端框架,只需要申请中断,然后注册中断
    发表于 07-29 08:57 786次阅读

    LINUX内核网络中的软中断KSOFTIRQD

    之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了,CPU会根据中断表,调用已经注
    发表于 12-15 11:44 1814次阅读

    Linux内核的编译主要过程

    Linux内核的编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 729次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的编译主要<b class='flag-5'>过程</b>

    Linux内核启动过程和Bootloader(总述)

    ,所以一般的 Bootloader 都会在执行过程中初始化一个串口做为调试端口(3)检测处理类型 Bootloader在调用 Linux内核
    发表于 08-18 17:35

    Linux内核自解压过程

    Linux内核的启动流程。有兴趣的用户可以参考其他书籍或资料进行深入了解。  嵌入式linux内核的启动全过程主要分为三个阶段。第一阶段为
    发表于 12-29 07:35

    Linux内核启动全过程解析

    向量表和初始化中断处理函数;初始化系统核心进程调度器和时钟中断处理机制;初始化串口控制台(console_init);ARM-Linux
    发表于 10-26 17:20

    linux内核启动内核解压过程分析

    linux启动时内核解压过程分析,一份不错的文档,深入了解内核必备
    发表于 03-09 13:39 1次下载

    Linux 2.4.x内核中断机制

    本文从Linux内核几种软中断机制相互关系和发展沿革入手,分析了这些机制的实现方法,给出了它们的基本用法。 软中断概况 软中断是利用硬件
    发表于 11-02 11:01 0次下载

    linux内核中断机制

    如果让内核定期对设备进行轮询,以便处理设备,那会做很多无用功,因为外设的处理速度一般慢于CPU,而CPU不能一直等待外部事件。所以能让设备在需要内核时主动通知
    发表于 11-14 15:48 3144次阅读

    linux驱动之中断处理过程C程序部分

    linux内核将所有的中断统一编号,使用一个irq_desc[NR_IRQS]的结构体数组来描述这些中断:每个数组项对应着一个中断源(可能是
    发表于 05-07 11:13 1036次阅读

    Linux驱动威廉希尔官方网站 之一内核中断

    在硬件上,中断源可以通过中断控制器向CPU提交中断,进而引发中断处理程序的执行,不过这种硬件中断
    发表于 05-08 13:49 642次阅读

    需要了解的Linux的IRQ中断子系统

    Linux中断子系统(generic irq)出现之前,内核使用__do_IRQ处理所有的中断,这意味着__do_IRQ中要
    发表于 05-10 10:56 1474次阅读

    Linux网络包接收过程的监控与调优

    上一篇文章中《图解Linux网络包接收过程》,我们梳理了在Linux系统下一个数据包被接收的整个过程Linux
    的头像 发表于 11-10 14:50 1676次阅读

    linux内核-时钟中断

    在所有的外部中断中,时钟中断起着特殊的作用,其作用远非单纯的计时所能相比。当然,即使是单纯的计时也已经足够重要了。别的不说,没有正确的时间关系,你用来重建内核的工具make就不能正常运行了,因为
    发表于 11-23 17:51 12次下载
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b>-时钟<b class='flag-5'>中断</b>

    Linux内核SoftIrq源代码分析

    我们在分析linux内核中断剖析时,简单的聊了一下SOFTIRQ, 而没有进行深入分析. Linux内核讲对一个外部设备
    发表于 06-23 15:22 589次阅读