中断是现代CPU工作方法中重要的部份。诸如:当你每次在按键上按下一个按钮后,CPU会被中断以促使PC读取用户按键的输入。这个过程发生得相当快,因而于在使用体验上你不会倍感任何变化或损害。
据悉,按键并不是造成中断的惟一组件。通常来说linux 虚拟主机,有三种类型的风波会造成CPU发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前linux系统中断,我须要先定义一些术语。
定义
中断恳求(IRQ)是由可编程的中断控制器(PIC)发起的,其目的是为了中断CPU和执行中断服务程序(ISR)。中断服务程序(ISR)是一个小的程序linux find,拿来处理具体的数据,其具体的处理方法依赖于导致中断恳求(IRQ)的诱因。之前正在运行的进程在中断服务程序(ISR)运行结束前就会被中断。
在过去,中断恳求由单独的芯片处理(中断控制器芯片PIC),I/O设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断恳求(IRQ),而且可以直接与CPU通讯。当一个中断恳求(IRQ)形成后,中断控制器(PIC)向CPU写入数据,但是触发中断恳求引脚(INTR)。
现现在,中断恳求(IRQ)由CPU中的中级可编程中断控制器advancedprogrammableinterruptcontroller(APIC)部份来处理。每位核中都拥有属于自己的中级可编程中断控制器。
中断的类型
正如我前文中提及的,中断可以按照其来源分为三种类型。
硬件中断
当一个硬件设备想要告诉CPU某一须要处理的数据早已打算好后(比如:当按键被按下或则一个数据包到了网路插口处),它将会发送一个中断恳求(IRQ)来告诉CPU数据是可用的。接出来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。
软件中断
当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速率才不会变化。这是由软件中断实现的,由精确的计时器系统(称为jiffies)重复发起的。这个计时器会促使你的音乐播放器同步。软件中断也可以被特殊的指令所调用,来读取或写入数据到硬件设备。
当系统须要实时性时(比如在工业应用中)linux系统中断,软件中断会显得重要。你可以在Linux基金会的文章中找到更多相关信息:面向嵌入式开发者的实时Linux介绍。
异常
异常exception是你可能之前就晓得的中断类型。当CPU执行一些将会造成除零或缺页错误的指令时,任何其他运行中的程序就会被中断。在这些情况下,你会被一个弹窗提醒,或在控制台输出中见到**段错误segmentationfault(核心已轮询coredumped)**。但并不是所有异常都是由指令错误导致的。
异常可以进一步分为错误Fault、陷阱Trap和中止Abort。
动手实践
中断恳求根据中级可编程中断控制器(APIC)中的优先级高低排序(0是最高优先级)。前32个中断(0~31)是由CPU指定的固定序列。你可以在OsDev异常页面找到关于它们的概述。此后的中断恳求可以以不同的形式进行分配。中断描述表interruptdescriptortable(IDT)中记录了中断恳求(IRQ)和中断服务程序(ISR)的对应关系。Linux中定义了从0到256的IRQ向量。
为了复印出在你的系统中已注册的中断,打开一个终端并输入:
cat /proc/interrupts
你应当会见到类似如右图的结果:
内核版本为5.6.6中注册的中断(StephanAvenwedde,CCBY-SA4.0)
从左到右各列的涵义依次为:中断向量号、每个CPU(0~n)中断发生次数、硬件来源、硬件源通道信息、以及导致中断恳求的设备名。
在表的末尾,有一些非数字的中断。它们是特定于体系结构的中断,如本地计时器中断localtimerinterrupt(LOC)的中断恳求(IRQ)号为236。其中一些在Linux内核源树中的LinuxIRQ向量布局手指定。
特定于体系结构的中断(StephanAvenwedde,CCBY-SA4.0)
假如要实时获取该表,请运行如下命令:
watch -n1 "cat /proc/interrupts"
总结
正确的中断恳求(IRQ)处理对于硬件、驱动和软件的正常交互是必要的。辛运地是,Linux内核挺好地完成了它,一个PC的普通用户几乎不会注意到内核的整个中断处理过程。
中断相当复杂,本文仅仅是一个关于中断的概述。假如想要深入了解该主题可以阅读LinuxInside电子书(CCBY-NC-SA4.0)和Linux内核教程库房。
{{o.name}}
{{m.name}}
程序员灯塔
转载请标明原文链接:Linux内核处理中断全过程解析