Linux-中断的本质

  学习中断是为了理解信号,因为信号即软中断。

  中断不是轮询!比如最常见的在UART通信过程中(收发数据),有两种方式,一种是中断,一种是轮询。如果中断是轮询,这两者就没区别了。但是中断(内部中断或者外部中断)和操作系统的处理时序,系统的定时器,CPU的架构密切相关的,每个中断(硬件中断)都会对应到CPU硬件的一个PIN脚上。在硬件(CPU)各PIN脚初始化的时候对其进行设置(Enable/Disable,中断优先级)。每个CPU都有自己的中断向量表,每一个中断向量对应的是一个地址(中断处理程序)。当中断发生时(突发事件,这里只说硬件中断),对应PIN脚上会发生电平变化(高电平有效还是低电平有效),通知系统优先处理(你自己的中断处理程序),跳到对应的中断向量(地址)上去,从特定地址开始执行相应的中断处理程序。

  中断发生时,比如外部中断,会通过8259芯片给CPU 一个电信号, 并将中断号放入到指定的寄存器, cpu 执行完当前指令之后会检查是否有中断发生,如果发现CPU中断引脚出现高位电平,则获取对于寄存器的中断号, 并根据该中断号查询中断向量表获取中断服务地址(中断向量表的入口是体系结构定死的+0000 入口地址+中断号 就可以获取中断服务入口地址),然后开始执行中断服务程序。

一、什么是CPU中断?

  使用计算机的过程中,经常会遇到这么一种情景:

  1. 你正在看电影

  2. 你的朋友发来一条QQ信息

  3. 你一边回复朋友的信息,一边继续看电影

  这个过程中,一切是那么的顺其自然。但理论上来说,播放电影的时候,CPU正在一丝不苟的执行着一条又一条的指令,它是如何在维持电影播放的情况下,及时接收并响应你的键盘输入信息呢?

  这就是CPU中断技术在起作用。

CPU中断技术的定义如下:

  1. 计算机处于执行期间
  2. 系统内发生了非寻常或非预期的急需处理事件
  3. CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序
  4. 处理完毕后返回原来被中断处继续执行

  在这里,“非寻常或非预期的事件”指的就是你回复朋友的QQ时,用键盘键入信息。为了及时响应你键入的信息,CPU将正在执行的任务“播放电影”暂时中断,处理完你键入的信息后,继续执行“播放电影”的任务。由于这个“中断当前任务->响应键盘输入->继续当前任务”的执行周期非常短(一般都是微秒级),所以一般人感觉不出来。

  举个现实中的例子:

  你正在看书,突然你的朋友打来电话,于是你放下书本去接电话,电话打完接着看书。

  电话响->放下书本->接电话->继续看书这一个过程,就类似于CPU中断的处理过程。

二、CPU中断的作用

  早期的CPU处理外设的事件(比如接收键盘输入),往往采用“轮询”的方式。即CPU像个查岗的一样轮番对外设顺序访问,比如它先看看键盘有没被按下,有的话就处理,没的话继续往下看鼠标有没有移动,再看看打印机……这种方式使CPU的执行效率很低,且CPU与外设不能同时工作(因为要等待CPU来“巡查”)。

  中断模式时就是说CPU不主动访问这些设备,只管处理自己的任务。如果有设备要与CPU联系,或要CPU处理一些事情,它会给CPU发一个中断请求信号。这时CPU就会放下正在进行的工作而去处理这个外设的请求。处理完中断后,CPU返回去继续执行中断以前的工作。

  中断模式的作用和优点在于:

  1. 可以使CPU和外设同时工作,使系统可以及时地响应外部事件。

  2. 可允许多个外设同时工作,大大提高了CPU的利用率,也提高了数据输入、输出的速度。

  3. 可以使CPU及时处理各种软硬件故障(比如计算机在运行过程中,出现了难以预料的情况或一些故障,如电源掉电、存储出错、运算溢出等等。计算机可以利用中断系统自行处理,而不必停机或报告工作人员。)

三、CPU中断的类型

  在计算机系统中,根据中断源的不同,通常将中断分为两大类:

  1. 硬件中断

  2. 软件中断

  硬件中断

  硬件中断又称外部中断,主要分为两种:可屏蔽中断、非屏蔽中断。

  可屏蔽中断:

  1. 常由计算机的外设或一些接口功能产生,如键盘、打印机、串行口等

  2. 这种类型的中断可以在CPU要处理其它紧急操作时,被软件屏蔽或忽略

  非屏蔽中断:

  1. 由意外事件导致,如电源断电、内存校验错误等

  2. 对于这种类型的中断事件,无法通过软件进行屏蔽,CPU必须无条件响应

  在x86架构的处理器中,CPU的中断控制器由两根引脚(INTR和NMI)接收外部中断请求信号。其中:

  1. INTR接收可屏蔽中断请求

  2. NMI接收非屏蔽中断请求

  典型事例:

  1. 典型的可屏蔽中断的例子是打印机中断,CPU对打印机中断请求的响应可以快一些,也可以慢一些,因为让打印机稍等待一会也是完全合理的。

  2. 典型的非屏蔽中断的例子是电源断电,一旦出现此中断请求,必须立即无条件地响应,否则进行其他任何工作都是没有意义的。

  软件中断

  软件中断又称内部中断,是指在程序中调用INTR中断指令引起的中断。比如winAPI中,keybd_event和mouse_event两个函数,就是用来模拟键盘和鼠标的输入(这个仅为笔者本人的猜测)。

四、CPU中断的过程

  中断请求

  中断请求是由中断源向CPU发出中断请求信号。外部设备发出中断请求信号要具备以下两个条件:

  1. 外部设备的工作已经告一段落。例如输入设备只有在启动后,将要输入的数据送到接口电路的数据寄存器(即准备好要输入的数据)之后,才可以向CPU发出中断请求。

  2. 系统允许该外设发出中断请求。如果系统不允许该外设发出中断请求,可以将这个外设的请求屏蔽。当这个外设中断请求被屏蔽,虽然这个外设准备工作已经完成,也不能发出中断请求。

  中断响应、处理和返回

  当满足了中断的条件后,CPU就会响应中断,转入中断程序处理。具体的工作过程如下:

  1. 关闭中断信号接收器

  2. 保存现场(context)

  3. 给出中断入口,转入相应的中断服务程序

  4. 处理完成,返回并恢复现场(context)

  5. 开启中断信号接收器

  中断排队和中断判优

  1. 中断申请是随机的,有时会出现多个中断源同时提出中断申请。

  2. CPU每次只能响应一个中断源的请求。

  3. CPU不可能对所有中断请求一视同仁,它会根据各中断源工作性质的轻重缓急,预先安排一个优先级顺序。当多个中断源同时申请中断时,即按此优先级顺序进行排队,等候CPU处理。

  了解了CPU中断处理的过程,就不难理解下面一种常见的情景:

  正在拷贝文件时,往某个文本框输入信息,这个文本框会出现短暂的假死,键盘输入的数据不能及时显示在文本框中,需要等一会儿才能逐渐显示出来。

  这是因为该中断操作(往文本框输入信息)在中断队列的优先级比较低,或者CPU认为正在处理的操作(拷贝文件)进行挂起的代价太大,所以只有等到CPU到了一个挂起代价较低的点,才会挂起当前操作,处理本次中断信息。

五、多核CPU对中断的处理

  多核CPU的中断处理和单核有很大不同。多核的各处理器核心之间需要通过中断方式进行通信,所以CPU芯片内部既有各处理器核心的本地中断控制器,又有负责仲裁各核之间中断分配的全局中断控制器。

  现今的多核处理器在中断处理和中断控制方面主要使用的是APIC(Advanced Programmable Interrupt Controllers),即高级编程中断控制器。它是基于中断控制器两个基础功能单元——本地单元以及I/O单元的分布式体系结构。在多核系统中,多个本地和I/O APIC单元能够作为一个整体通过APIC总线互相操作。

  APIC的功能有:

  1. 接受来自处理器中断引脚的内部或外部I/O APIC的中断,然后将这些中断发送给处理器核心进行处理

  2. 在多核处理器系统中,接收和发送核内中断消息

  对于外部设备发出的中断请求,由全局中断控制器接收请求并决定交给CPU的哪一个核心处理。也可针对APIC编程,让所有的中断都被一个固定的CPU处理。

摘自:

  https://www.zhihu.com/question/21440586?sort=created

  http://www.cnblogs.com/funeral/archive/2013/03/06/2945485.html

时间: 2024-10-13 04:20:46

Linux-中断的本质的相关文章

linux中断子系统:中断号的映射与维护

写在前沿: 好久好久没有静下心来整理一些东西了,开始工作已有一个月,脑子里想整理的东西特别多.记录是一种很好的自我学习方式,静下来多思考多总结,三年的工作目标不能发生变化,作为职场菜鸟即将进入全世界半导体第一的Intel working,是机遇更是一种挑战,困难也是可想而知.脚踏实地.仰望星空,以结果为导向,以目标为准则,争取每天进步一点点. Linux内核版本:3.4.39 一. linux中断子系统的irq_desc初始化 linux内核最初的中断初始化过程入口为start_kernel.在

Linux中断技术、异常控制技术总结归类

相关学习资料 <深入理解计算机系统(原书第2版)>.pdf http://zh.wikipedia.org/zh/%E4%B8%AD%E6%96%B7 独辟蹊径品内核:Linux内核源代码导读 李云华著 中文 PDF版 https://www.kernel.org/ http://blog.csdn.net/orange_os/article/details/7485069 http://blog.csdn.net/sunnybeike/article/details/6958473 目录 1

Linux中断(interrupt)子系统之一:中断系统基本原理

这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层.内核版本基于3.3.虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变. /*****************************************************************************************************/ 声明:本博内容

linux中断流程详解

异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核搭建了一个非常容易扩充的中断处理体系. 中 断系统结构涉及的方面很多,而且分布在很多的函数中,这里我主要理清一些结构和流程顺序已经在哪些函数中实现,我不知道其他人怎么样?但是我自己一开始怎 是找不到linux内核是怎么把GPIO设置成中断的,我找了很久都找不到,还有我们很多的设置,初始化等等东西好像

Linux中断(interrupt)子系统之一:中断系统基本原理【转】

转自:http://blog.csdn.net/droidphone/article/details/7445825 这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层.内核版本基于3.3.虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变. /***************************************************

Linux中断(interrupt)子系统

Linux中断(interrupt)子系统之一:中断系统基本原理 Linux中断(interrupt)子系统之二:arch相关的硬件封装层 Linux中断(interrupt)子系统之三:中断流控处理层 Linux中断(interrupt)子系统之四:驱动程序接口层 & 中断通用逻辑层 Linux中断(interrupt)子系统之五:软件中断(softIRQ) http://blog.csdn.net/droidphone/article/details/7497787

Java线程中断的本质深入理解(转)

一.Java中断的现象 首先,看看Thread类里的几个方法: public static boolean interrupted 测试当前线程是否已经中断.线程的中断状态 由该方法清除.换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外). public boolean isInterrupted() 测试线程是否已经中断.线程的中断状态 不受该方法的影响. public void in

linux中断申请之request_threaded_irq

转载:linux中断申请之request_threaded_irq 在linux里,中断处理分为顶半(top half),底半(bottom half),在顶半里处理优先级比较高的事情,要求占用中断时间尽量的短,在处理完成后,就激活底半,有底半处理其余任务.底半的处理方式主要有soft_irq, tasklet, workqueue三种,他们在使用方式和适用情况上各有不同.soft_irq用在对底半执行时间要求比较紧急或者非常重要的场合,主要为一些subsystem用,一般driver基本上用不

13.linux中断处理程序

linux中断处理程序 一.中断处理流程 在linux内核代码中进入entry-armv.S目录: linux统一的入口:__irq svc. 进入了统一的入口之后,程序跳到irq_handler标号(在同一个文件上面有说明): 而irq_handler实际上是调用上面的arch_irq_handler_defualt.该代码在entry-macro-multi.S里面. 在这个中断处理程序中.最重要的是get_irqnr_and_base获取产生中断的中断源,搜索这个宏.这里以2410的为例(

Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】

转自:http://blog.csdn.net/droidphone/article/details/7467436 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] CPU的中断入口 初始化 中断控制器的软件抽象struct irq_chip 进入流控处理层 中断控制器的级联 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得驱动程序的开发人员不用关注底层的实现,要实现这个目标,内核的开发者们必须把硬件相关的内容剥离出来,然后定义一些列标准