精华内容
下载资源
问答
  • 中断请求中断请求级 中断是异步过程调用,简而言之就是打断当前CPU正在执行的任务转而去执行另一个任务 windows在初始化时,为每种中断安装了一个中断处理例程---ISR(intterupt service routine),它们储存在...
    中断请求与中断请求级 
    
    中断是异步过程调用,简而言之就是打断当前CPU正在执行的任务转而去执行另一个任务
    windows在初始化时,为每种中断安装了一个中断处理例程---ISR(intterupt service routine),它们储存在IDT(intterupt dispatch table中断分发表)中,每次发生中断,处理都将询问中断控制器,中断控制器会将当前发生中断映射成一个中断号,用这个中断号作为索引在IDT中查询,然后CPU将转到对应的ISR去执行(当然,此时我们还没有考虑中断请求级的问题),顺便说明,如果是多CPU,那么每个CPU都会有自己的IDT
    中断分硬件中断和软件中断,硬件中断一般是由可中断的外部设备造成的,比如说鼠标呀,键盘呀,网卡呀,等等……
    软件中断一般是什么APC( Asynchronous  procedure call)调用啊,DPC(Dispatch/deferred procedure call)调用啊……貌似也就这些哦,嘿嘿

    至于中断请求级,系统为每种硬件中断定义了一个请求级,与其说定义,不如说是一种算法。比如在单CPU的X86系统上,会简单的用27减去中断号,得到中断请求级(IRQL),
    我们常见的x86系统上,请求级只有0-31个级别,数字越大,级别越高
    软件中断只有两种中断请求级,APC_LEVEL,DISPATCH_LEVEL,对应我前面说的两种软软件中断
    至于最后一种,PASSIVE_LEVEL,听名字你就知道,它是最低的,是被动的,所有用户模式代码和大部分驱动设备都运行在这个级别上

    中断请求级有什么用?
    中断请求级是控制当前处理器任务的关键,此时你必须明白,每个处理器都会有自己当前的中断请求级,这是处理器的一个状态,记住,是状态,可变的
    中断级其实是作为一个屏蔽界限在使用,为什么这么说?很简单,如果此时处理器正运行在IRQL为A上,此时所有硬件和软件产生的中断的IRQL为B,如果B<=A,B被屏蔽,如果B>A,然后处理器保存当前运行的线程环境,转到处理中断B。在B<A的情况下,处理器可能将B交给其他处理器去处理(多核情况下),也可能保留这个中断,直到某个时刻,处理器的中断请求级降下来了,满足B抢断CPU任务条件了,那么B中断就会被处理了

    看某些书时,总是会有这么醒目的一行字, 运行在DISPATCH_LEVEL上的代码,绝对不能等待一个内核对象,也绝对不能出现页故障
    为什么?简单解释下
    如果运行在DISPATCH_LEVEL级别的代码,等待一个内核对象,那么此时CPU是闲置的,线程调度器将强制切换到另一个需要执行的线程,但是线程调度和我们此时运行的代码是同一个中断级啊,按照前面的规则,是不能打断我们的代码执行的,那么将不会有任何线程切换,CPU将一直因为我们的代码等待内核对象而空闲,这叫啥,占着茅坑不XX……嘿嘿。至于不能发生也故障,其实也一样,因为我们的代码如果访问一个处于分页池中的内存的地址,那么将触发页故障,内存管理器将产生I/0异常,CPU此时就得等待文件系统将磁盘数据读入内存,这样一来,又是等待了,和前面等待内核对象一样,线程调度器必须调度,却调度不了,然后当前线程继续执行,访问错误的内存,继续BSOD!

    再来聊聊DPC例程:分发(或者叫调度)或延迟调用例程
    DPC例程,望文生义下下,运行在DISPATH_LEVEL上 = =
    A:分发例程调用(dispatch procedure call)
    1:系统的线程调度运行在DISPATCH_LEVEL上,每当一个线程时间片用完,而此时线程未完成其任务,系统将插入一个DISPATCH_LEVEL的中断请求调用线程调度器,但是它将等到当前线程完成某些任务直到其中断级降至DISPATCH_LEVEL以下,调度器才会运行。如果线程是主动结束或者等待,那么调度器将直接运行并切换线程
    2:对内核共享数据的访问,应该将当前线程提升至DISPATCH_LEVEL,此时任何软中断,包括线程时间片用完时系统插入的DISPATCH_LEVEL级别的线程调度中断,都将被屏蔽,直到对数据操作完,降低IRQL,其他软中断才会得以处理……这样就保证了数据在可以完整的被读写
    B:延迟例程调用(deferred procedure call)
    1:延迟例程是完成某一项不是特别紧要的任务的函数
    2:延迟例程以对象表示
    3:每个CPU都有一个延迟例程队列
    4:系统将在DISPATCH_LEVEL上处理延迟例程,即是,当前线程所在的CPU中断级即将从DISPATCH_LEVEL降下来,系统将保持此时的CPU中断级为DISPATCH_LEVEL,然后一个个调用DPC对象,直到DPC列为空时。另外,当满足任一一种抽空条件时,系统会执行抽空动作,若此时CPU中断级小于DISPATCH_LEVEL,系统将直接处理DPC队列并提升至DISPATCH_LEVEL……当抽空动作完成后,系统恢复原有的中断级,继续原有的任务(注意:因为DPC是在DISPATCH_LEVEL上被处理,所以延迟例程中,不能调用)

    未完待续…………

    展开全文
  • linux中断--中断嵌套&中断请求丢失.docx
  • CPU中断请求理解

    2019-10-26 14:52:13
    CPU软中断 1、什么是中断 中断表示我们请求操作事件准备就绪了,例如从磁盘...首先会在驱动程序中嵌入中断程序,一旦磁盘准备就绪就会通过驱动程序发生一个中断请求操作,CPU立马停下手里的活来执行中断程序,该中断...

    CPU软中断

    1、什么是中断

    中断表示我们请求操作事件准备就绪了,例如从磁盘读取数据,我们知道CPU执行速度比磁盘执行速度快几个数量级,因此如果CPU每次check磁盘是否准备就绪了,那么系统的并发能力和性能会大大下降,但是采用中断方式,异步事件驱动方式来提升系统效率,首先会在驱动程序中嵌入中断程序,一旦磁盘准备就绪就会通过驱动程序发生一个中断请求操作,CPU立马停下手里的活来执行中断程序,该中断程序会从磁盘中读取数据到内存中。

    2、如何避免丢失其他中断请求

    一定要保证中断程序快速能处理,因为当CPU在处理中断时,是不能响应其他中断请求的,那么就会导致其他中断请求丢失

    举个取外卖的例子:我们在app上点外卖,但是这个外卖不知道什么时候到,因为送外卖小哥一旦到了目的地就会放下外卖就走,这个时候你就会一次又一次的check外卖是否到了,然而你什么时候也干不了,仅仅在来来回回看外卖是否到了,导致浪费你的时间。

    改进方式:如果换一种方式,你和外卖小哥约定一个通知方式,例如当外卖到了家门口小哥就打电话通知我,我就出去取外卖。 打电话就是一次中断请求,你就安心的干其他事情,静静等电话。 如果你点了两份外卖,当第一份外卖到了,小哥电话通知你,但是你在电话中沟通发票问题,这个时候第二份外卖到了另外一个小哥给你打电话发现占线,几次尝试后还是失败,这个时候外卖小哥就走了,导致丢失了这次外卖。

    **解决:**在电话中只回答好,然后沟通发票问题当面说,这个时候就可以接到另外小哥的电话。 所以系统的中断请求分为两个阶段:

    第一阶段(上半部请求):接受硬件中断请求(从硬件中取完数据后发送一次软断请求,复杂逻辑交给下半部分请求,),称为硬中断,特点是处理速度快

    第二阶段(下半部请求): 内核线程接受到上半部分软中断请求,就会异步的继续执行上半部未完成的请求, 称为软中断,特点延迟执行

    举个网络接受数据例子:

    当网卡接收到数据时,首先会发送一个硬中断请求,这个时候CPU就会执行中断处理程序,快速将网卡中数据读取到内存中,完成后会发送一个软中断请求,下半部被软中断信号唤醒后就会按照网络协议栈将内存数据进行解析处理,最终递给应用程序。(处理期间还是可以响应其他硬中断请求的)

    中断中的异步事件机制提高并发能力思想应用到了现在流行的网络通讯框架Netty中,提高系统吞吐量,详细了解Netty实现原理Reactor模式

    3、查看硬中断和软中断运行情况

    可以查看 /proc/interrupts 和 /proc/softirq 文件

    从 /proc/softirq文件中可以看到软中断类型
    TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU 锁)

    总结

    一般如果软中断占用CPU多时,大多都是系统读取网卡数据太频繁了(要么数据包太小、可能受到了SYNC FLOOD攻击 (交换机或防火墙屏蔽此ip,防止将数据进入系统中))

    展开全文
  • 行业制造-电动装置-在电平触发中断方式中响应短脉冲中断请求的装置及方法.zip
  • 快速中断请求(Fast Interrupt Request,FIQ) 在ARM中,FIQ模式是特权模式中的一种,同时也属于异常模式一类。用于高速数据传输或通道处理,在触发快速中断请求(FIQ)时进入。 FIQ和IRQ(外部中断模式)之间有很大...
    快速中断请求(Fast Interrupt Request,FIQ)
    

    在ARM中,FIQ模式是特权模式中的一种,同时也属于异常模式一类。用于高速数据传输或通道处理,在触发快速中断请求(FIQ)时进入。

    FIQ和IRQ(外部中断模式)之间有很大的区别。FIQ模式必须尽快处理,处理结束后离开这个模式;IRQ模式可以被FIQ模式中断,但IRQ不能中断FIQ模式;为使FIQ模式响应更快,FIQ模式具有更多的影子(Shadow)寄存器。FIQ模式必须禁用中断;如果一个中断例程必须重新启用中断,应使用IRQ模式而不是FIQ模式。

    展开全文
  • 中断请求级别

    千次阅读 2015-11-03 15:09:59
    Windows有两种中断请求(IRQ, INTERRUPT REQUEST),一种是外部中断,也就是硬件中断,另外一种是软件中断,比如常用的INT 3下个断点。 现在的x86计算机基本都是用高级可编程控制器(Advanced Programmable ...

    Windows有两种中断请求(IRQ, INTERRUPT REQUEST),一种是外部中断,也就是硬件中断,另外一种是软件中断,比如常用的INT 3下个断点。

    现在的x86计算机基本都是用高级可编程控制器(Advanced Programmable Interrupt Controller, 简称APIC)来控制IRQ。正在运行的线程可以随时被中断打断,进入到中断处理程序。优先级高的中断可以打断优先级低的中断处理程序,进入更高级别的中断处理函数。APIC中总共有24个IRQ。

    IRQL(INTERRUPT REQUEST LEVEL)

    Windows将中断的概念进行了扩展,提出一个中断请求级(IRQL)的概念。其中规定了32个中断请求级别,分别是:

    0 - 2级为软件中断

    3 - 31级为硬件中断(包括APIC的24个中断)

    如图(图片来自于《windows驱动开发技术详解》):

                                         

    Windows大部分时间都运行在软件中断级别中,即0-2级别。当有设备中断来临时,windows会将IRQL提升至硬件中断级别(DIRQL, DEVICE INTERRUPT REQUEST LEVEL),并且运行相应的硬件中断处理函数。当硬件中断结束后,恢复到原来的IRQL。

    用户模式的代码是运行在最低级别的PASSIVE_LEVEL中,驱动程序的DriverEntry函数,派遣函数,AddDevice函数一般运行在PASSIVE_LEVEL中(驱动程序的StartIO和DPC函数运行在DISPATCH_LEVEL中),它们在必要的时候可以申请进入DISPATCH_LEVEL级别,使用内核函数KeGetCurrentIrql()可以知道系统的当前IRQL。

    Windows负责线程调度的组件运行在DISPATCH_LEVEL级别,当前线程运行完时间片后,操作系统自动从PASSIVE_LEVEL提升至DISPATCH_LEVEL级别,从而可以使得线程调度组件可以调度其他的线程。当线程切换完成后,操作系统又从DISPATCH_LEVEL级别恢复到PASSIVE_LEVEL级别。

    线程优先级

    线程优先级不同于IRQL,应用程度在PASSIVE_LEVEL运行的时候,程序员可以设定线程优先级(可以使用API SetThreadPriority)。优先级高代表可以有更多机会在CPU上运行。当线程调度内核组件运行于DISPATCH_LEVEL的时候,所有应用程序的线程都停止,等着被调度。

     

    IRQL和分页内存(虚拟内存)

    Windows支持虚拟内存,当有需要的时候windows会将物理内存上暂时不用的数据交换到虚拟内存以腾出内存空间给其他应用使用。当应用程序需要这些数据的时候,由于这些数据不在物理内存上,那么就会产生一个页故障,页故障的异常处理函数会将虚拟内存上相关的数据交换到物理内存,这样应用程序就可以读取数据了。页故障运许出现在PASSIVE_LEVEL级别的程序中,但如果出现在DISPATCH_LEVEL或者更高级别的程序中会带来崩溃。

    所以,对于高于或者等于DISPATCH_LEVEL级别的程序不能使用分页内存,必须使用非分页内存,不然就是崩溃(比如驱动程序的StartIO,DPC函数中,千万不要使用分页内存,不然就死翘翘了)。

     

    控制IRQL提升和降低

    通过几个内核函数可以读取,提升或者降低当前IRQL。分别是:KeGetCurrentIrql, KeRaiseIrql和KeLowerIrql。

    ===============================================================================================

    IRQL

       IRQL是Interrupt ReQuest Level,中断请求级别。一个由windows虚拟出来的概念,划分在windows下中断的优先级,这里中断包括了硬中断和软中断,硬中断是由硬件产生,而软中断则是完全虚拟出来的。
      处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。
      我们在调用NDIS API时,在DDK帮助文档中都有该API函数的所在级别。
       PASSIVE_LEVEL
      IRQL最低级别,没有被屏蔽的中断,在这个级别上,线程执行用户模式,可以访问分页内存。
       APC_LEVEL
      在这个级别上,只有APC级别的中断被屏蔽,可以访问分页内存。当有APC发生时,处理器提升到APC级别,这样,就屏蔽掉其它APC,为了和APC执行一些同步,驱动程序可以手动提升到这个级别。比如,如果提升到这个级别,APC就不能调用。在这个级别,APC被禁止了,导致禁止一些I/O完成APC,所以有一些API不能调用。
       DISPATCH_LEVEL
      这个级别,DPC 和更低的中断被屏蔽,不能访问分页内存,所有的被访问的内存不能分页。因为只能处理非分页内存,所以在这个级别,能够访问的Api大大减少。
       DIRQL (Device IRQL)
      一般的,更高级的驱动在这个级别上不处理IRQL,但是几乎所有的中断被屏蔽,这实际上是IRQL的一个范围,这是一个决定某个驱动有更高的优先级的方法。

    展开全文
  • 程序中断方式是指:CPU在执行程序的过程中,如果因出现某种随机事件而收到中断请求,则暂时停止现行程序的执行,转去执行一段中断服务程序,以处理该事件,并在处理完毕后自动恢复程序的执行。 中断请求串行优先电路...
  • 中断请求

    千次阅读 2008-10-28 12:05:00
    中断请求级Windows NT为每个硬件中断和少数软件事件赋予了一个优先级,即中断请求级(interrupt request level - IRQL)。IRQL为单CPU上的活动提供了同步方法,它基于下面规则:一旦某CPU执行在高于PASSIVE_LEVEL的...
  • 这样会引起一些问题,那么就可以在前端代码中直接中断当前的请求; 下面发出一个请求: const task = wx.request({ url: 'xxxxxxx', method: 'xxxxxxx', data: { a: 'xxxx', b: 'xxxx' },   succe...
  • linux中断--中断嵌套&中断请求丢失

    千次阅读 2014-04-14 20:06:04
    在linux内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中断,这时候新的中断会被...
  • 主机与外部设备的信息...程序中断方式是指:CPU在执行程序的过程中,如果因出现某种随机事件而收到中断请求,则暂时停止现行程序的执行,转去执行一段中断服务程序,以处理该事件,并在处理完毕后自动恢复程序的执行。
  • 主动中断请求

    千次阅读 2016-11-02 23:40:18
    如果此时用户选择了切换页面,这时候我们可以选择将还在进行中的请求主动中断。 jQuery 参考 //可以在通用的入口abort()掉request var request = $.ajax({ type: 'POST' , url: 'someurl' , ...
  • 关于中断请求标志位

    千次阅读 2013-07-19 09:22:47
    今天才发现我用了这么长时间的中断服务函数,竟然不知道中断请求标志位到底具体是什么意思~~~悲哀!!!   一般就用了定时器中断服务函数,没关心中断请求标志位,今天才发现,原来定时器中断请求标志位就是...
  • linux下查看中断请求记录 IRQ

    万次阅读 2015-08-03 14:43:07
    linux下查看中断请求记录。通过cpu的中断请求的响应,可以看出cpu都在为哪些设备干活,干的活有多少量等信息。 [~]$ cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 1383283707 0 0 0 IO-A
  • 中断有两种,一种是由CPU外部产生的,对于执行中的软件来说,这种中断的发生完全是“异步”的,根本无法预料此类中断会在什么时候发生,一般由其他硬件设备产生(例如键盘中断);另一种是由CPU本身在执行程序的过程...
  • 硬件中断请求IRQ

    千次阅读 2010-03-22 17:38:00
    http://tech.sina.com.cn/c/2004-05-17/0931362528.shtml 文/蔡远翔  IRQ(Interrupt Request)的...比如我们要打印一份文件,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。 产
  • 如下所示: Vue.prototype.$ajax=axios; const CancelToken = axios.CancelToken; let cancel; let cancelAjaxText = '中断成功'; Vue.prototype.post = ... cancelToken: new CancelToken(c => { //强行中断请求
  • 如何接受和响应中断源的中断请求

    千次阅读 2008-04-06 15:12:00
    如何接受和响应中断源的中断请求,因机器而异如,在PC中:有可屏蔽的中断请求INTR: 主要是输入输出设备的I/O中断, 通过建立在PSW中的中断屏蔽位加以屏蔽,即使再有I/O中断,处理器也不响应不可屏蔽的中断请求: 属于...
  • IRQL 中断请求级别

    千次阅读 2009-12-26 15:39:00
    IRQL是Interrupt ReQuest Level,中断请求级别。处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。我们经常...
  • 这让大家很疑惑,因为当中断请求发生时,也是往这些未决寄存器中置1。那么怎么来区分是中断请求还是清中断呢??  查看了下s3c2440数据手册,上面只是说:“A。如果你从中断服务程序返回却没有清除该位,中断 ...
  • 6.3 x86处理器如何处理MSI-X中断请求

    千次阅读 2013-07-22 16:28:14
    PCIe设备发出MSI-X中断请求的方法与发出MSI中断请求的方法类似,都是向Message Address所在的地址写Message Data字段包含的数据。只是MSI-X中断机制为了支持更多的中断请求,在MSI-X Capablity结构中存放了一个指向...
  • IRQL中断请求级别

    千次阅读 2013-03-08 09:57:03
    DIRQ,设备级中断,这是硬件设备的中断,只有底层的驱动程序才处理这个中断。 DISPATCH——LEVEL,运行于这个级别的处理器会屏蔽除DPC以外的中断,不能访问可交换内存,所以这个级别能调用的API函数大大...
  • 如何解决电脑中断请求IRQ冲突

    千次阅读 2012-12-10 22:12:00
    如何解决电脑中断请求IRQ冲突 (如何解决IRQ冲突     轻松分配板卡资源  中断是计算机处理特殊问题的一个过程,当计算机执行程序的过程中出现某个特殊情况时,会暂时中止现行程序,转去执行这...
  • IRQL中断请求级别及APC_LEVEL讨论

    千次阅读 2014-07-16 16:23:42
    IRQL是Interrupt ReQuest Level,中断请求级别。处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。 我们...
  • 6.2 PowerPC处理器如何处理MSI中断请求

    千次阅读 2013-07-22 16:28:12
    PowerPC处理器使用OpenPIC中断控制器或者MPIC中断控制器,处理外部中断请求。其中MPIC中断控制器基于OpenPIC中断控制器,但是作出了许多增强,目前Freescale新推出的PowerPC处理器,其中断控制器多与MPIC兼容。 值得...
  • 本文通过按键发起中断请求尝试学习PL请求中断的处理机制。 板子用的是zc702。 ZYNQ是中断类系统框图: 由上图可知,zynq的中断分为三种: 1.软件中断(SGI,Software generatedinterrupts,中断号0-15)...
  • AsyncTask的实用-中断请求实现

    千次阅读 2014-02-27 13:57:01
    我常用的方式是new AsyncTask(), 可能比较方便吧,弊端:就是一旦请求,没有焦点,只能等待黑圈转完;new Thread() 好处是好控制,但是用多了占内存; 前几天跟同事讨论了下,翻看了下源码,方案来了! 我们要实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 283,590
精华内容 113,436
热门标签
关键字:

中断的请求方式