暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

到底什么是中断

一十二章经 2021-01-24
896
  1. 用户态的应用程序进行系统调用时发生上下文切换陷入内核中,陷入内核这个过程会触发一个异常控制流(Exceptional Control Flow,ECF),通过ECF陷入内核,然后执行相应的系统资源调用

  2. 网卡收到网络包后也会触发ECF,通知CPU数据到了,然后CPU再触发另一个ECF来处理网卡收到的网络包,将网络包数据从内核态拷贝到用户态内存

上面两段读起来是不是很绕口?那我换种说法:

  1. Linux操作系统中,用户态应用程序触发0x80中断进入内核,进行系统调用
  2. 网卡收到网络包后触发硬中断,CPU响应硬中断后由软中断将网络包数据从内核态空间拷贝至用户态空间

第二种说法加粗显示的部分其实在《深入理解计算机系统》书中并不是泛泛的称为'xx中断',而是叫异常,平时在网上看的帖子都把中断等同于操作系统中的异常,但其实中断只是异常的一个种类而已。如果理不清这个关系可能会造成不必要的理解上的错误。

第一种说法是我认为比较严谨的说法,而第二种是比较容易理解的说法,可是如果按照第二种说法去理解,那么有些事情其实是无法解释的。比如我们平时所说的中断处理程序到底是个什么东西,0x80中断、硬中断、软中断的中断处理程序是不是同一个呢?

异常种类

异常可以分为4大类别:中断(interrupt)、陷阱(trap)、故障(fault)和终止(abort)。本篇主要理清中断与陷阱。因为这两种异常就涵盖了开篇第二种说法中的0x80中断、硬中断、软中断。

在intel X86-64架构CPU中有256中异常类型,每种异常类型对应一个8位二进制的无符号整数,换算过来就有256中类型,这256中异常类型会在系统开机时形成一张异常表,当有异常产生时就会根据表中的编号去查找对应的异常种类。表中还包含了对应的每种异常的处理程序地址,因此也就能够执行相应的异常处理程序。

其中0~31号位的异常是由 Intel架构师定义的异常,32~255号是操作系统定义的中断和陷阱。

我们开头所说的0x80中断其实对应异常表中0x80(十进制128)位置的异常类型,查询后发现0x80是陷阱类型,那么就会执行相应的异常处理程序进行处理。

中断

中断的产生是来自处理器外部的 I/O 设备的信号,比如敲打键盘、鼠标等I/O设备就会产生一个硬件异常,开头所说的网卡收到数据包后会产生一个中断信号,读取异常表中对应的异常号后,CPU会通过对应的中断处理程序(interrupt handler)处理中断信号。

网卡触发的硬中断就是属于此类型异常,硬中断还包括像键盘鼠标等I\O设备产生的中断信号。因为计算机不知道用户什么时候会敲击键盘而且用户敲击后要立马响应,因此对于CPU而言次类信号是突发的,特点就是处理速度快,响应快。

陷阱

陷阱类型异常是CPU故意触发的,这点跟中断类型异常很不一样。陷阱的应用场景最多的是在用户态程序进行系统调用时,让控制流陷入内核,然后调用内核相关函数(eg:read)对系统资源进行操作。文章开头所说的0x80中断、网卡软中断都是属于异常类型。很多文章中会说产生软中断后会调用中断处理程序其实这种说法不是很准确,在《深入理解计算机系统》中,把处理陷阱的程序叫陷阱处理程序。中断处理程序只是处理硬件中断类型的程序。

在Linux系统中把处理陷阱类异常都统称为软中断,而软中断又跟上述的硬件中断很相似,因此才造成了很多概念上混淆。

我们接下来把0x80异常的大体流程走一遍。当用户态程序需要进行系统调用时会执行一条systemcall n
,这条指令会对应到异常表中0x80位置,然后执行该位置的陷阱处理程序,接着陷阱处理程序解析n,得知需要调用什么样的系统资源,比如n就是read磁盘。这样就通过异常表的方式得到异常类型并执行相应的处理程序,接下来就是处理程序怎么知道是执行read函数呢,这个时候就需要另外一张跳转表了。

在Linux系统中存在几百种系统调用,每个系统 调用都有一个唯一的整数号,对应于一个到内核中跳转表的偏移量(注意:这个跳转表和异常表不一样)。如上述systemcall n中的n对应的就是一个Linux中系统调用。

有了系统调用表后,陷阱处理程序就能够准确的进行资源的操作。

另外,在Linux中处理所有的陷阱类型的异常都是由固定的内核线程处理,每颗CPU都维护一个这样的内核线程,名字为ksoftirqd/CPU 编号
。比如4核CPU就有4个这样的内核线程,命名为:ksoftirqd/0、ksoftirqd/1、ksoftirqd/2、ksoftirqd/3。

Linux系统中的软中断等价于陷阱类型的异常

总结

通过本篇理清了计算机系统的异常种类,并主要讲解了中断异常、陷阱异常。其中中断异常来自于I\O硬件,陷阱异常是CPU自发的,用于处理用户态程序陷入内核态并进行资源的操作或像网卡这类I\O设备收包后下半部的程序处理。硬件中断有对应的中断处理程序,陷阱异常有对应的陷阱处理程序。这类程序统称为异常处理程序,并且在异常表中都有一一的对应关系,无论发生哪种异常,只需查表就可确认异常的类型是中断还是陷阱,并根据表中的代码位置执行不同逻辑的处理程序。

参考:《深入理解计算机系统》


文章转载自一十二章经,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论