您好、欢迎来到现金彩票网!
当前位置:双彩网 > 向量屏蔽 >

Linux中断系列之中断或异常处理(四)

发布时间:2019-06-16 19:55 来源:未知 编辑:admin

  异常处理过程:不需要产生电信号,当异常发生时,CPU通过特定的中断向量,从IDT找到相应的门描述符,可从中获取异常服务程序的地址并执行。

  1、中断控制器是外部设备和CPU之间中断信号的桥梁,中断控制器主要有三个寄存器:IRR ISR IMR

  (1) IRR:中断请求队列,共8bit,对应八个引脚。中断到来时,若未被屏蔽,则IRR相应位置置1,表示收到中断请求,但未交给CPU。

  (2) ISR:中断服务寄存器,共8bit,对应八个引脚。当IRR中某个中断请求送往CPU后,该位置1,表示已递交给CPU,但CPU未处理完。

  (3) IMR:中断屏蔽寄存器,共8bit,对应八个引脚,当某位置1,表示对应中断引脚被屏蔽。

  2、引脚的优先级问题:有两种优先级管理方式,固定优先级和循环优先级,固定优先级不可改变,而循环优先级在系统工作过程中可以动态改变。

  一般嵌套模式,指在一个中断被处理的时候,一直相比低优先级或同等优先级会自动被屏蔽,而高优先级则可以响应。

  (1) 中断请求:设备发起中断,与之相连的IR引脚产生电信号,若对应中断未被屏蔽,IMR对应位为0,则将IRR对应位置1,通过INT引脚向CPU的INTR引脚发出请求信号。若被屏蔽,则丢弃。

  (2) 中断响应:CPU响应中断三个条件:至少有一个中断请求;CPU允许中断;当前指令执行完毕。

  8259A在提交中断请求信号,CPU可能在执行一条指令,并不会立即响应。此时还可能有其他IRQ线也产生了中断请求。

  当CPU执行完一条指令后,回去检查INTR管脚是否有信号,若有则检查EFLAGS寄存器中断允许标志IF是否为1,为1,则通过INTA引脚应答8259A。

  (3) 优先级判定:8259A收到CPU应答后,在IRR挑取优先级最高的中断,将其ISR对应的位置1。表示中断正在接收CPU的处理。

  (4) 提交中断向量:CPU通过INTA第二次发送脉冲,8259A根据被设置的起始信号量,计算最高的优先级的中断向量(比如起始向量号为16,当前中断请求为IRQ3,则得到的中断向量号为19),通过数据线递交给CPU。

  (5) 中断结束:递交中断向量后,8259A会检测是否AEOI模式,若是自动清除中断请求信号,将ISR相应位置0。若不是则等待CPU发送EOI指令(由中断服务程序发起),收到EOI,ISR相应位会清零。

  注:也就是说,在递交中断向量之前,高优先级的中断可以打断低优先级,而递交之后则不能。因为内核接收到中断向量后直接进入中断门,同时CPU会清零EFLAGS的IF位。

  当CPU在正在处理IRQ1时,IRQ2线A会自动将其与ISR中的值比较,ISR上有IRQ1置1,则仅仅IRR上置1。若IRQ0来了信号,相同的比较,发现IRQ0优先级大,此时8259A将IRQ0的ISR位置1,并向CPU发出中断请求。因为此时正在处理IRQ1,所以ISR上ISR0和ISR1均为1。

  8259A是AEOI模式,ISR中的位总是被清零(在提交中断向量号后),意味着如果有新的中断线A会立刻向CPU提交中断请求,即使在处理IRQ0的中断,CPU只会简单应答8259A。因此这种情况下低优先级的中断会打断高优先级的中断服务程序。

  1、确定中断或异常的中断向量i(0~255之间)。可屏蔽中断的中断向量从中断控制器获得,不可屏蔽中断或异常的中断向量是固定的。

  3、进行特权级检查,将当前CPU的特权级CPL与门描述符的DPL比较,若小于或等于DPL,则进入门,之后,将获取门描述符中所指向代码段的DPL与CPL比较,如果小于或等于CPL,则执行中断服务程序。如果两次比较其中一次不符,则进入通用保护异常(中断向量13)。

  4、若上述过程(1-3)检测到特权级发生变化,则需要进行堆栈转换。中断或异常程序运行在内核态(特权级0),而中断或异常在用户态(特权级0)时发生,此时需要从用户态(特权级3)变成内核态(特权级0),所以要将堆栈从用户态堆栈切换到内核态堆栈。

  6、如果是中断,进入中断门后,CPU会清零EFLAGS的IF位,即关闭所有的可屏蔽中断;如果是异常则不清零此位。(见handle_IRQ_event代码)

  1、所有中断(不可屏蔽中断除外)的服务程序在init_IRQ函数均被初始化为interrupt[i],数组每一项指向一个代码片段,此代码片段将中断向量压入堆栈外,之后调用了一个公共处理程序common_interrupt

  关于common_interrupt公共处理程序,每个中断发生后都会调用此函数。此程序功能如下:

  (注:在IRQ层引入之前,所有的IRQ线都共用一个公共的服务程序__do_IRQ对中断进行处理,它们对应的结构体都不同引入IRQ层以后的;引入后,后面讲解)

  其功能:1 屏蔽当前的IRQ,禁止该IRQ线的中断传递。

  2 判断中断请求队列是否为空,即是否有一个或多个中断服务程序,

  如果有则调用handle_IRQ_event函数进行遍历,执行相应程序处理中断

  (承接上面)关于common_interrupt公共处理程序,每个中断发生后都会调用此函数。此程序功能如下:

  (注:在IRQ层引入之后,对不同类型中断的处理流程做出了区分,各类型中断有单独的公共服务程序,比如:边沿触发中断handle_edge_irq,电平触发中断对应handle_level_irq函数,8259A就是对应电平触发。          中断系列六讲解:通用IRQ层)

  ④ 调用每个IRQ自身的公共服务程序,对不同类型中断的处理流程做出了区分,并分别设置了一些对应的服务程序;

  其功能:1 屏蔽当前的IRQ,禁止该IRQ线的中断传递。

  2 判断中断请求队列是否为空,即是否有一个或多个中断服务程序,

  如果有则调用handle_IRQ_event函数进行遍历,执行相应程序处理中断

  如果返回内核空间,则会检查被中断进程的preempt_coount是否为0,只有为0时才能调用schedule函数。

  与中断不同,各种异常都具有固定的中断向量和固定的异常服务程序(在trap_init中指定)。当异常发生时,将直接跳入相应的服务程序中。每个异常都有自己的代码段

  如同中断跳入common_interrupt函数中一样,异常则跳入汇编函数error_code中,也是公共处理程序,这个程序对每个异常都一样

  2、CPU响应(INTA)后,8259A进行优先级判定,将寄存器ISR此时最高优先级位置1,将IRR对应位置0;

  3、8259A等待CPU二次信号(INTA),提交中断向量i,可能为(0~255)之间的值,其中异常除外;

  4、基本上8259A都是可屏蔽中断(32~255),还有不可屏蔽中断和异常中断向量是确定的(0~31);

  5、根据IDTR找到的IDT,CPU用中断向量从IDT中读取第i项(即第i个门描述符);

  如果i(32~255)此时CPU通过门描述符跳到其对应的代码段(在初始化的时候代码段的地址也存储在interrupt[i]中,然后存入中断门中)。

  10、如果是0~31就直接执行中断服务程序了,看13步;如果是32~255先执行代码片段,将中断向量号压入堆栈中,然后跳到公共处理程序comm_interrupt。

  11、comm_interrupt执行的任务是先保存现场,中断前寄存器的值保存在堆栈中,然后调用函数do_IRQ;

  12、do_IRQ函数任务(参看三),其实对于32~255号,中断的处理是’分-总-分‘的结构,分:先是硬件通过IRQ号找到门描述符,然后找到各自的代码片段,转向内核处理,总:每个代码片段又会调用同一个汇编函数common_interrupt,

  分:接下来又通过irq号找到对应的irq_desc结构体,然后根据这个结构体执行自身的中断服务程序。

  中断是一种当今很重要的硬件与cpu通信的方式,主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu的数目往往要少得多,那么肯定会有多个硬件中断竞争一个cpu的情况,任何系统(包括自然界)都不能乱...

  ULK第四章里明确讲到“Linux实现了一种没有优先级的中断模型”,并且“Linux中断和异常都支持嵌套”。这个我不太理解了,这两种说法都与我以前的理解刚好相反,核对了原书,翻译没有错。 Linux中...

  基本型80C51系列单片机有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。中断的优先级在说到中断之前,我先来定义一下优先级,明白...

  原文地址 方法之三:以数据结构为基点,触类旁通结构化程序设计思想认为:程序=数据结构+算法。数据结构体现了整个系...

  来源:CSDNphenix_lord的专栏硬件处理最近解决一个关于Linux中断的问题,把相关机制整理了一遍,记录在此。不同的外部设备、不同的体系结构、不同的OS......

  为什么要有进程优先级?这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来,进程执行占用cpu的能力就是一个必须要可以人为控制的事情。因为有的进程相对重要,而有的进程则没那么重要。...

  关于中断嵌套:在linux内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中...

  学习本文可以对linux中断有全面而深刻的认识。本文对Linux中断所涉及的需求、管理机制、中断实现、中断接口(上半部和下半部)、驱动使用进行完全分析。...

  中断处理1中断的请求和释放当设备需要中断功能时,应当向内核请求中断。如果驱动工程师没有通过请求中断的方式通知Linux内核需要使用中断,那么内核只会简单的应答并且忽略该中断。 1.1请求中断线请求中断...

  一、中断体系结构1)ARM体系CPU的7种工作模式  ①:7种工作模式:    A、用户模式(usr):ARM处理器正常的程序执行状态    B、快速中断模式(fiq):用于高速数据传输或通道处理  ...

  首先说一下本人萌新一名,刚接触嵌入式三四个多月,由于工作需要,不得不研究嵌入式操作系统,一开始觉得挺新鲜的,后面感觉坑越来越深,问题越来越多,但还好自己也没放弃,经过一段时间的学习,积累,慢慢把很多问...

  本文简单理一下嵌入式linux对于ARM系列SoC的中断管理。    我将嵌入式linux的中断分为了3个级别,分别是:    1. CPU级:   嵌入式linux只使用了ARM的IRQ中断...

  ByToradex秦海1). 简介GPIO应用是嵌入式设备最基本的应用之一, 本文就基于EmbeddedLinux系统演示开发GPIO中断以及输出相关的基本应用示例.本文所采用的硬件平台来自与Tora...

  原创文章,转载请注明出处。这篇文章主要讨论的话题是当中断发生时Linux内核是如何处理中断的。当CPU检测到中断的时候,linux内核首先会跳转至arch/arm/kernel/entry-armv....

  中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。...

  Linux中断处理程序设计中断概念        中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。      为什么需要中断?1、外设的处理速度一般慢于CPU2、 ...

  看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解。先从函数注册引出问题吧。一、中断注册方法在linux内核中用于申请中...

  linux内核的中断处理,里面由始至终都贯穿着重要的事马上做,不重要的事推后做的异步处理思想.于是整理一下~第一阶段--获取中断号每个CPU都有响应中断的能力,每个CPU响应中断时都走相同的流程....

  之前调试vxworks下PCIE的中断程序,都封装好了,所以只用了个intConnect,感觉没学到东西,就再看了下Linux的源码。   下面是最近调试中断时额外研习了一下Linux的内核代码,下面...

  一般申请中断的时候都允许开中断,即不使用SA_INTERRUPT标志。如果允许共享则加上SA_SHIRQ,如果可以为内核熵池提供熵值(譬如你写的驱动是ide之类的驱动),则再加上SA_SAMPLE_R...

  Platform:msm8x60Kernel:2.6介绍Linux将中断分为中断上半部和下半部。上半部用来处理紧急的和硬件操作相关的,下半部用来处理能够被允许推迟完成的中断处理部分。两者之间的界限依情...

  异常体系比较复杂,但是linux已经准备了很多的函数和框架,但是因为中断是和具体的开发板相关,所以中断需要我们自己来处理一些方面,但是这也是很少的一部分,很多公用的处理函数内核已经实现,linux内核...

  linux中断子系统系列文章计划总共由5篇文章组成,本篇会通过中断的执行流来整体介绍一下中断,并引出其他文章的内容简介,中断的代码基本在kernel/irq目录下,中断控制器的代码在drivers/i...

  本文原地址:————————————————————————————————————————...

  第三章 中断处理3.1中断和中断处理中断处理程序是被内核调用来响应中断的,运行在中断上下文,中断处理程序是上半部,当接收到一个中断时,它就立即开始执行,但只做有严格时限的工作。中断处理程序的注册是通过...

  Linux将处理程序分解为两个半部:顶半部(TopHalf)和底半部(BottomHalf)。   顶半部用于完成尽量少的比较紧急的功能,它往往只是简单读取寄存器中的中断状态,并在清除中断标志后就进行...

  linux中断系统那些事之----中断处理过程以外部中断irq为例来说明,当外部硬件产生中断时,linux的处理过程。首先先说明当外部中断产生时,硬件处理器所做的工作如下:R14_irq=addres...

  问答问:Linux的中断可以嵌套吗?答:以前是可以嵌套的,现在不可以!历史早前的Linux内核版本,中断分为两种:快中断,申请的时候带IRQF_DISABLED标记,在I......

  当linux内核空间发生中断后怎么使用户空间的应用程序运行相应的函数呢,当芯片有数据到来时内核会产生一个中断,但是怎样通知应用程序来取数据,以前这个问题一直困扰我很长时间,后来发现linux中有异步通...

  中断是Linux内核中比较难而且比较重要的一部分,如果想掌握这些东西,理解是首当其冲的一个重要环节。所谓的难点,新知识,如果完全理解了原理,至少相当于掌握了80%,这对于任何知识都一样,所谓真正理解,...

  一、概念内核需要管理连接到计算机上的硬件设备,如硬盘,蓝光碟机,键盘,鼠标,3D处理器,以及无线电等。内核提供一种机制,让硬件在需要的时候再向内核发出信号。这就是中断机制。从物理学角度看,中断是一种电...

  中断基础介绍中断就是CPU正常运行期间,由于内、外部事件引起的CPU暂时停止正在运行的程序,去执行该内部事件或外部事件的引起的服务中去,服务执行完毕后再返回断点处继续执行的情形。中断的意义极大提高CP...

  一、中断是什么中断是指CPU在执行程序的过程中,出现了某些突发事件急需处理,CPU暂停当前程序的执行,转去处理突发事件,处理完后又返回原程序被中断的地方继续执行。中断分为两种:(1)中断,又叫外部中断...

  这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版本不断地提升,不...

  中断系统基本原理这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版...

  一、中断介绍所谓中断是指CPU在执行程序的过程中,出现了某些突发事件需要紧急处理,CPU必须暂时停止当前的工作,转去执行处理突发事件,处理完毕又返回原程序被中断的位置继续执行。在ARM多核处理器中最常...

  之前一直学习的是Linux系统下面的字符驱动开发,但是那仅仅是Linux驱动下面的冰山一角,Linux驱动开发还包括什么网络设备开发、原子锁、块设备开发、网络设备开发等等部分,本篇文章将介绍lin...

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗! Docker的三大核心概念:镜像、容器、仓库 镜像:类似虚拟机的镜像、用俗话说就是安装文件。 容器:类似一个轻量...

  前言:前段时间做项目用到了图片裁剪,调用系统裁剪图片,结果在我的小米3上一直有问题,裁剪界面打不开,在其他设备上没问题,于是研究其他软件是怎么做的,淘宝的裁剪图片是自己做的,当然没问题,京东的是调用的...

  zwenkaiIntellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程

  Intellij IDEA 如何通过数据库表生成带注解的实体类图文详细教程 Intellij IDEA 如何通过数据库表生成带注解的实体类 Contents 第一步:新建...

  灰度图像的自动阈值分割(Otsu 法)机器视觉领域许多算法都要求先对图像进行二值化。这种二值化操作阈值的选取非常重要。阈值选取的不合适,可能得到的结果就毫无用处。今天就来讲讲一种自动计算阈值的方法。这...

  用以前以前写过的自定义课表软件 ,Android 自定义View课程表表格 原生View截图合成分享的图片 看到的是图片只显示到11节处,下面的没有...

  本matplotlib安装过程在一定程度上参考了 因为学习机器学习的需要,又准备参考《机器学...

  servlet页面代码:@每次请求时产生一个token(一般为时间戳),存于session中并随之用hidden提交,在servlet中判断接收到的token和session中的是否一致来判断是否重复...

  首先,确定你已经有了CSR证书请求、开发证书和App ID。如果你不是第一次开发iOS应用程序,那么你可能已经有了这些东西。那么你可以继续以下的步骤。一、配置App ID登录你的provisionin...

  目前还没有写出这个demo,不过可以参考下面这两个链接,一个是显示日期的,还有一个是合并单元格: 合并单元格:

  以回归为例吧,回归在某些场合可能更精准 支持连续变量和类别变量,类别变量就是某个属性有三个值,a,b,c,需要用Feature Transformers中的vectorindexer处理 上来是一堆...

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...

  简述关于gif的使用在实际项目中我用的并不多,因为我感觉瑕疵挺多的,很多时候锯齿比较严重,当然与图存在很大的关系。关于生成gif的方法可以提供一个网站preloaders,基本是可以满足需求的。简述 ...

  本博客暂停更新,后期专注维护个人公众号『高效程序员』,欢迎关注!python版本DDOS攻击脚本

  今天为了休息下,换换脑子,于是就找到了我之前收藏的一篇python的文章,是关于ddos攻击的一个脚本,正好今天有空,就实践下了。 附上源码pyDdos.py: #!/usr/bin/env ...

http://bluecaleel.com/xiangliangpingbi/156.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有