Linux kernel如何处理中断?
中断是计算机处理数据的一个关键部分。
中断是现代CPU工作方式的一个重要组成部分。例如,每次您按键盘上的一个键时,CPU都会被中断,以便PC可以从键盘读取用户输入。这种情况发生得如此之快,以至于您从用户体验方面不会注意到任何的变化或损害。
而且,键盘不是唯一会触发中断的组件。通常,有三种类型的事件可以触发CPU中断:硬件中断,软件中断和异常。在介绍不同类型的中断之前,我首先将定义一些术语。
定义
中断请求(IRQ)由可编程中断控制器(PIC)发起,目的是中断CPU以便执行中断服务程序(ISR)。通常,中断服务程序 ISR是一段小程序,依据触发该IRQ的原因它会处理某些数据。所以,一般来说,当发生中断时,CPU正常处理流程被中断,转去处理ISR,直到它完成。
过去,IRQ是由单独的微控制器芯片PIC处理的,而所有I / O设备的中断直接连接到PIC,由PIC汇总并管理各种设备的IRQ,之后再由PIC直接与CPU通信。当某个设备发起IRQ时,PIC首先接受到该请求,接着它可经由中断请求引脚(INTR)把该中断请求IRQ发给CPU。
如今,IRQ由高级可编程中断控制器(APIC)处理,该控制器是处理器的一部分。每个处理器内核都有自己的一个APIC。
中断类型
如前所述,根据其来源不同,中断可以分为三种类型:
硬件中断
当硬件设备准备好某些数据需要CPU来处理时(例如键盘输入或数据包到达网络接口时),它会发送IRQ来通知CPU该数据可用。CPU接收到该IRQ后, 将中断当前执行的处理,调用在内核启动期间由设备驱动程序注册好的特定的中断服务程序ISR。
软件中断
播放视频时,同步音乐和视频播放非常重要,这样音乐的速度不会改变。这是通过一个软件中断来完成的,该软件中断由一个精确的计时器系统(称为jiffies)反复触发。此计时器使您的音乐播放器能够同步。软件中断也可以通过特殊指令来触发,以从硬件设备读取数据,或将数据写入硬件设备。
当需要实时功能时(例如在工业应用中),软件中断也至关重要。您可以在Linux Foundation的文章“Intro to real-time Linux for embedded developers”中找到有关此问题的更多信息。
异常
您可能已经知道异常是一种中断类型。当CPU执行一条将导致被零除或页面错误的命令时,任何其他执行都会中断。在这种情况下,将通过弹出窗口或在控制台输出中看到段异常(core dumped)来通知您。但是,并非每个异常都是由错误的指令引起的。
异常可以进一步分为故障Fault,陷阱Trap和挂止Abort。
故障Fault:故障是系统可以纠正的异常,例如,当某个进程试图访问已交换到硬盘驱动器的内存页面中的数据时,故障就会被纠正。请求的地址在进程地址空间内,并且访问权限正确。如果RAM中不存在该页面,则会引发IRQ,并启动页面错误异常处理程序以将所需的内存页面加载到RAM中。如果操作成功,将继续执行。
陷阱Trap:陷阱主要用于调试。如果在程序中设置断点,则会插入一条特殊指令,使该指令触发陷阱。陷阱可以触发上下文切换,从而允许调试器读取和显示局部变量的值。之后可以继续执行。陷阱也是执行系统调用的默认方式(例如终止进程)。
挂止Abort:挂止是由硬件故障或系统表中的值不一致引起的。挂止不报告导致异常的指令的位置。这些是最关键的中断。挂止调用系统的中止异常处理程序,该处理程序终止导致它的进程。
动手实践
在APIC上的向量表中,IRQ按优先级排序(0 =最高优先级)。前32个中断(0-31)具有由CPU指定的固定顺序。您可以在OsDev的“异常”页面上找到它们的概述。后续的IRQ可以根据需要分配。中断描述符表(IDT)包含IRQ和ISR之间的映射关系。 Linux为从0到256的映射定义了一个IRQ向量表。
要在系统上打印已注册中断的列表,请打开控制台并键入:
cat / proc / interrupts
您应该会看到以下内容:
从左到右,这些列是:IRQ向量,每个CPU的中断计数(0 .. n),硬件源,硬件源的通道信息以及引起IRQ的设备名称。
在表格的底部,有一些非数字中断。它们是特定于体系结构的中断,例如IRQ 236上的本地计时器中断(LOC)。其中一些是在Linux内核源树的Linux IRQ矢量布局中指定的。
与架构相关的中断(Stephan Avenwedde)要获得此表的实时视图,请运行:
watch -n1 “ cat / proc / interrupts”
结论
正确的IRQ中断处理对于硬件,驱动程序和软件之间的正确交互至关重要。幸运的是,Linux内核确实做得很好,普通的PC用户几乎不会注意到有关kernel整个IRQ中断处理的任何信息。
这可能变得非常复杂,并且本文仅对该主题进行了简要概述。 Linux Inside eBook(CC BY-NC-SA 4.0)和Linux Kernel Teaching库是深入研究该主题的良好信息资源。
原文链接:How the Linux kernel handles interrupts
如果感觉到本文对您有所助益,您可以请我喝一杯咖啡。