精华内容
下载资源
问答
  •  中断处理过程:一次完整的中断过程中断请求、中断响应和中断处理三个阶段组成。  中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->...
    
    在程序员面试和笔试中中断是一个经常被问及的很基础的问题,本文对这次问题做一点简单说明。

         中断处理过程:一次完整的中断过程由中断请求、中断响应和中断处理三个阶段组成。

         中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点

        中断服务程序的限制

    (1)ISR 没有参数并且返回类型为 void
    2ISR 不可以重复进入,不要在 ISR内允许中断。

    3)当中断发生时系统会自己响应。用户不要调用它。

    4ISR 中不要调用任何 C 自定义函数,但是内置的函数没有关系。ISR 中可调用汇编函数。
    5)如果 ISR 内包含嵌入汇编指令,那么由于执行这些指令而影响到的寄存器就需要在执行这些指令之前预先保留,待执行完毕恢复寄存器。 因为Holtek C编译器只保存由于C语句造成影响的寄存器。

    6ISR内不能有可能导致阻塞的语句如:malloc

    7)避免在ISR中做浮点运算,在许多处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就不允许在ISR中做浮点运算。此外,ISR应该是段而有效率的,在ISR中做浮点运算是不明智的。

    有了以上知识,下面的题目应该是小Case了

    1. 下面的ISR有何问题(华硕公司2005年软件工程师面试)  
    2. _interrupt double compute_area(double radius)  
    3. {  
    4.     double area = PI*radius*radius;  
    5.     printf("/nArea=%f",area);  
    6.     return area;  
    7. };  

    展开全文
  • 一,中断的定义 二 ,中断处理过程 三,8086/8088CPU可以处理256种不同类型的终端 四,中断服务程序的设计方法 五中断向量表的建立

    一,中断的定义
    在CPU执行程序的过程中,出现了某种紧急或异常的事件(中断请求),CPU需要暂时停止正在执行的程序,转去处理该事件(执行终端服务程序),并在处理完毕后,返回断点继续执行被暂停的程序,这一过程,称为中断。
    二 ,中断处理的过程主要有五步
    1.中断请求
    2.中断响应
    3.保护断点
    4.中断处理
    5.中断返回
    三,8086/8088CPU可以处理256种不同类型的终端
    四,中断服务程序的设计
    1.用户在设计中断服务程序时要预先确定一个中断类型号,不论是硬件中断还是软件中断,都只能在系统预留给用户的类型号中选择,
    2.确定中断类型号之后还要把中断服务程序入口地址置入中断向量表,以确保在中断响应时CPU能自动转入该类型号相对应的中断服务程序。
    3.中断向量表的建立
    设用户定义的中断类型号为60H
    1)DOS系统功能调用法
    功能号:(AH)=25H
    入口参数:
    (AL)=中断类型号
    (DS)=中断服务程序的入口地址的段地址
    (DX)=中断服务程序的入口地址的段地址
    下面程序段完成中断类型号为 60H的中断服务程序的入口地址的置入

    PUSH	DS          //保护DS
    MOV	DX,	OFFSET INT _60     //取中断服务程序INT_60的偏移地址
    MOV	AX,	SEG INT _60        //取中断服务程序INT_60的段地址
    MOV	DS,	AX
    MOV	AH,	25H     //送功能号
    MOV	AL,	60H      //送中断类型号
    INT	21H              //DOS功能调用
    POP	DS               //恢复DS
    

    2)直接装入法
    用传送指令直接将中断服务程序入口地址置入中断向量表。
    设中断类型号为60H,此类型号对应的中断服务程序入口地址应存放在中断向量表00180H开始的四个连续存储单元中。
    采用直接装入的程序段如下:

    XOR	AX,	AX	//清零
    MOV	DS,	AX
    MOV	AX,	OFFSET INT_60
    MOV	DS:	[0180H],	AX      // 置中断服务程序INT_60的偏移地址
    MOV	AX,	SEG INT_60
    MOV	DS:	[0180H+2],	AX        //置中断服务程序INT_60的段地址

    接下来会对可编程中断控制器8259 A进行理解,请大家拭目以待!
    学习是对体系结构的一种建立,今天不会的不要慌,当体系结构达到一个水准之后,或许明天就会了呢?
    目之所及,皆是回忆!
    心之所想,皆是过往!
    眼之所看,皆是遗憾!

    展开全文
  • 中断处理程序&中断服务例程

    千次阅读 2016-06-03 13:58:23
    中断处理程序(Interrupt Handler)和中断服务例程ISR(Inerrupt Service Routine)是两个不同的概念;一条中断线对应一个中断处理程序,而一个中断处理程序再对应若干个中断服务例程,如下: 所有的中断服务例程...
    中断处理程序(Interrupt Handler)和中断服务例程ISR(Inerrupt Service Routine)是两个不同的概念;一条中断线对应一个中断处理程序,而一个中断处理程序再对应若干个中断服务例程,如下:


    所有的中断服务例程挂在中断请求队列中,这个工作是由request_irq()函数来完成的,其实也就是对中断服务例程进行注册,关于这个函数的具体实现在include/linux/interrupt.h中。而中断处理程序就相当于某个中断向量的总的处理程序,比如上图中IRQ0x09_interrupt()是中断号为9(向量为47)的总处理程序,假如这个9号中断由5个设备共享,那么这5个设备都分别有其对应的中断服务例程。
     

    当有多个设备需要共享某个中断线时,中断处理程序必须要调用ISR,此时会调用handle_IRQ_event()来运行挂在该中断线上的所有中断服务例程,下图给出了具体的调用关系:

    这其实就是中断处理程序的执行过程。其中IRQn_interrupt表示从IRQ0x00_interrupt到IRQ0x0f_interrupt的任意一个中断处理程序。这个中断处理程序需要调用do_IRQ()函数,而do_IRQ()函数对收到的中断请求进行应答,并禁止这条中断线,然后要确保这条中断线上有一个有效的中断服务例程,而且目前这个这个中断服务例程已经启动但未执行。这时do_IRQ()调用handle_IRQ_event()来运行挂在这条中断线上的所有中断服务例程。
     

    补充说明一下在内核中用于让多个设备共享一条中断线而设置的数据结构irqaction(3.7版本的内核):
    typedef irqreturn_t (*irq_handler_t)(int, void *);    //声明一个中断服务例程的钩子函数,返回值为irqreturn_tx型
    struct irqaction {
                  irq_handler_t handler;                             //指向一个具体的I/O设备的中断服务程序 
                  void *dev_id;                                           //指定的I/O设备的主设备号和次设备号
                  void __percpu *percpu_dev_id;              //用于识别不同cpu设备的资料
                  struct irqaction *next;                              //指向用于共享中断线的下一个irqaction结构
                  irq_handler_t thread_fn;                         //指向一个具体的线程化中断的中断服务例程 
                  struct task_struct *thread;                       //指向线程中断的线程指针
                  unsigned int irq;                                      //所申请的中断号
                  unsigned int flags;                                  //一组用于描述中断线与I/O设备之间关系的中断标志 
                  unsigned long thread_flags;                   //用于描述线程中断的中断标志
                  unsigned long thread_mask;                  //中断掩码
                  const char *name;                                  //中断设备名称 
                  struct proc_dir_entry *dir;                       //指向IRQn相关的/proc/irq/n目录的描述符
    ____cacheline_internodealigned_in_smp;                

    展开全文
  • 中断和中断处理程序

    千次阅读 2015-04-09 21:28:59
    处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一... 硬件设备生成中断的时候并不考虑与处理器的时钟同步——也就是说中断随时可以产生。内核随时可能因为新到来的中断

    处理器的速度跟外围硬件设备的速度往往不在一个数量级上,因此,如果内核采取让处理器向硬件发出一个请求,然后专门等待回应的方法,显然差强人意;轮询虽然能够解决这个问题,但会周期性地重复执行。更好的办法是让硬件在需要的时候向内核发出信号(变内核主动为硬件主动),这就是中断机制。

    6.1 中断
    硬件设备生成中断的时候并不考虑与处理器的时钟同步——也就是说中断随时可以产生。内核随时可能因为新到来的中断而被打断。从物理学的角度看,中断是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚。然后由中断控制器向处理器发送相应的信号。
    不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识。这些中断值通常被称为中断请求(IRQ)线。
    异常
    异常与中断不同,它在产生时必须考虑与处理器的同步。实际上异常也常常被称为同步中断。在处理器执行到由于编程失误而导致的错误指令的时候,或者是在执行期间出现特殊情况(例如缺页),必须靠内核来处理的时候,处理器就会产生一个异常。
    因为许多处理器体系结构处理异常与处理中断的方式类似,因此,内核对它们的处理也很类似。我们已经熟悉一种特殊的异常:系统调用处理程序异常。 中断的工作方式与之类似,其差异只在于中断是由硬件而不是软件引起的。
    6.2 中断处理程序
    在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程(interrupt service routine,ISR)。产生中断的每一个设备都有一个(中断处理程序通常不是和特定设备相关联,而是和特定中断相关联,也就是说,若一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理程序,相应的,该设备的驱动也就需要准备多个这样的函数。)相应的中断处理程序。一个设备的中断程序是它设备驱动程序的一部分——设备驱动程序是用于对设备进行管理的内核代码。
    在Linux中,中断处理程序看起来就是普普通通的C函数。只不过这些函数必须按照特定的类型声明,以便内核能够以标准的方式传递处理程序的信息。中断处理程序与其它内核函数的真正区别在于:中断处理程序是被内核调用来响应中断的,而它们运行于我们称之为中断上下文的特殊上下文中。
    上半部与下半部的对比
    通常我们把中断处理切为两个部分或两半。中断处理程序是上半部——接收到一个中断,它就立即开始执行,但只做有严格时限的工作,这些工作都是在所有中断被禁止的情况下完成。能够被允许稍后完成的工作会推迟到下半部去。在合适的时机,下半部会被开中断执行。
    6.3 注册中断处理程序
    中断处理程序是管理硬件的驱动程序的组成部分。每个设备都有相关的驱动程序,如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序。驱动程序可以通过下面的函数注册并激活一个中断处理程序。 int request_irq( unsigned int irq,
    irqrequest_t(handler)( int, void , struct pt_regs *),
    unsigned long irqflags,
    const char * devname,
    void *dev_id)
    (1)第一个参数irq表示要分配的中断号。
    (2)第二个参数handler是一个指针,指向处理这个中断的实际中断处理程序。
    (3)第三个参数irqflags可以为0,也可能是下列一个或多个标志的位掩码:SA_INTERRUPT:此标志表明给 定的中断处理程序是一个快速中断处理程序。SA_SAMPLE_RANDOM:此标志表明这个设备产生的中断对 内核熵池有贡献。SA_SHIRQ:此标志表明可以在多个中断处理程序之间共享中断线。
    (4)第四个参数devname是与中断相关的设备的ASCII文本表示法(设备名)。这些名字会被/proc/irq和proc/interrupt文件使用,以便与用户通信。
    (5)第五个参数 dev_id主要用于共享中断线。用于区分共享中断线上的各个中断处理程序。内核每次调用中断处理程序时,都会把这个指针传递给它。实践中往往会通过它传递驱动程序的设备结构:这个指针是唯一的,而且有可能在中断处理程序内及设备模式中被用到。注意,request_irq()函数可能会睡眠,因此,不能在中断上下文或其他不允许阻塞的代码中调用该函数。一个例子:
    if(request_irq(irqn, my_interrupt, SA_SHIRQ, “my_device”, dev))
    {
    printk(KERN_ERR “my_device: cannot register IRQ %d\n”, irqn); return -EIO;
    } 该例子中我们用dev_id传递dev结构体(通常情况下均取该值)。
    释放中断处理程序
    卸载驱动程序时,需要注销相应的中断处理程序,并释放中断线。调用void free_irq(unsigned int irq, void *dev_id)来释放中断线。如果指定的中断线不是共享的,则仅删除dev_id所对应的处理程序,而这条中断线本身只有在删除了最后一个处理程序时才会被禁用。不管在那种情况下,如果dev_id非空,它都必须与需要删除的处理程序相匹配。
    6.4 编写中断处理程序
    一个典型的中断处理程序声明: static irqreturn_t intr_handler(int irq, void *dev_id, struct pt_regs *regs) 注意,它的类型与request_irq()参数中handler所要求的参数类型相匹配(在前面我没已经看到,handler函数有一个类型为 irqreturn_t的返回值)。dev_id是一个通用的指针,它与在中断注册时传递给request_irq()的参数dev_id必须一致。 dev_id也有可能指向中断处理程序使用的一个数据结构,对每个设备而言,设备结构都是唯一的,而且可能在中断处理程序中也用的到,因此,也通常会把设备结构传递给dev_id。 中断处理程序的返回值是一个特殊类型:irqreturn_t。它可能返回两个特殊的值:IRQ_NONE和IRQ_HANDLED。当中断处理程序检测到一个中断,但该中断对应的设备并不是在注册处理函数期间指定的产生源时,返回IRQ_NONE;当中断处理程序被正确调用,且确实是它所对应的设备产生了中断时,返回IRQ_HANDLED。
    6.4.1 共享的中断处理程序
    共享的处理程序与非共享的处理程序在注册和运行方式上比较相似,但差异主要有以下几点:
    (1)request_irq()的参数flags必须设置SA_SHIRQ标志。
    (2)对每个注册的中断处理程序来说,dev_id参数必须唯一。而指向任一设备结构体的指针就可以满足这一要求;通常会选择设备结构,因为它是唯一的,而且中断处理程序可能会用到它。
    (3)中断处理程序必须能够区分它的设备是否真的产生中断。这既需要硬件支持,也需要处理程序中有相关的处理逻辑。(大多数硬件设备提供状态寄存器或类似机制,以便中断处理程序进行检查)
    6.5 中断上下文
    当执行一个中断处理程序或下半部时,内核处于中断上下文中。让我们先回忆一下进程上下文。进程上下文是一种内核所处的模式,此时内核代表进程执行——例如,执行系统调用或运行内核线程。在进程上下文中,可以通过current宏关联当前进程。中断上下文和进程并没有什么瓜葛。与current宏也是不相干的(它此时指向被中断的进程)。中断上下文不可以睡眠。如果一个函数睡眠,就不能在中断处理程序中使用——这是对什么样的函数可以在中断处理程序中使用的限制。
    中断上下文有较为严格的时间限制,因为它打断了其他代码。中断上下文中的代码应当迅速简洁,尽量不要使用循环去处理繁重的工作。请永远牢记:中断处理程序打断了其他的代码(甚至可能是打断了在其他中断线的另一个中断处理程序)。尽量把工作从中断处理程序中分离出来,放在下半部来执行,因为下半部可以在更合适的时间运行。写中断处理程序时不必关心栈如何设置,或者内核栈的大小是多少。总而言之,尽量节约内核栈空间。
    6.6 中断处理机制的实现
    中断处理系统在Linux中的实现是非常依赖于体系结构的。实现依赖于处理器、所使用的中断控制器的类型、体系结构的设计及机器本身。设备产生中断,通过总线把电信号发送给中断控制器。如果中断是激活的,那么中断控制器就会把中断发往处理器。在大多数体系结构中,这个工作就是通过电信号给处理器的特定管脚发送一个信号,处理器会立即停止它正在做的事情,关闭中断系统,然后跳转到内存中预定义的位置开始执行那里的代码。这个预定以的位置是内核设置的,是中断处理程序的入口点。 在内核中,中断的旅程开始于预定义入口点,这类似于系统调用通过预定义的异常句柄进入内核。对于每一个中断线,处理器都会跳到对应的一个唯一的位置。至此,内核知道了所接受的中断的IRQ号。初始入口点只是在栈中保存这个号,并存放当前寄存器的值(这些值属于被中断的任务),然后,内核调用函数 do_IRQ()。

    展开全文
  •  中断处理流程:关中断->保存断电保护现场->判断中断源转到相应的中断服务->开中断->执行相应的中断服务程序(ISR)->关中断->恢复现场恢复断点->开中断->返回断点 中断服务程序的限制(1)ISR 没有参数并且返回...
  • 中断处理程序中断服务例程

    千次阅读 2017-07-20 11:27:21
    1 什么是中断2中断处理程序3中断服务例程4request_irq函数分析 1. 什么是中断 简单来说中断就是硬件设备与处理器的一种交流方式,比如当我按下一个键时,只有当处理器知道我按下了这个键并且做出相应...
  • 中断机构和中断处理程序

    千次阅读 2018-12-29 18:06:32
    什么是中断中断实际上是对信号做出的一种反应, 即CPU对I/O设备发来的中断信号的一种反应。是由外部设备引起的。俗称外中断。 在此插一嘴什么是陷入?...中断处理程序位于I/O系统的底层,直接与硬件进行交...
  •  驱动程序可以通过下面的函数注册并激活一个中断处理程序,以便处理中断:int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irgflags, const char *...
  • 完整的中断处理过程分为 1)中断响应的事前准备: 系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都...
  • 中断服务程序

    2017-05-16 11:05:32
    1 中断服务程序(ISR) 从外设中读取中断状态寄存器的值,以便了解中断类型 根据中断类型具体设计处理逻辑 清楚外设状态寄存器中的中断标识位 清除处理器中的中断标识位 2 软件工程师眼中的中断服务程序 不能有...
  • 这是书上I/O中断部分“单重中断和多重中断服务程序的流程”,我的疑问是: 1、保护现场包括 :a.保护程序断点;b.保存各寄存器内容。书上说: a由中断隐指令完成,b由中断服务程序完成 我理解为:ab都属于保护现场...
  • 中断处理程序

    千次阅读 2019-01-30 18:02:52
    引例 除法错误中断处理 assume ds:a ...我们执行完div bh,我们应该执行076a:0007的mov ax,0001,但是因为这个除法溢出,所以获取调用0号中断处理程序,即0000:0 ~0000:3 四个字节的内容,就是这个中断...
  • 中断服务程序设计实验

    千次阅读 2014-04-27 19:54:28
    1、 熟悉中断的概念、中断响应过程中断向量表以及系统是如何根据中断类型号在中断向量表中得到该中断对应的中断服务程序的入口地址等内容。 2、 掌握中断服务程序的设计方法。 2.7.2 实验预习要求 1、 ...
  • Linux内核使用中断的方式来管理硬件设备,中断本质上是一种电信号,设备通过和中断控制器引脚相连的总线发出电信号来发出中断中断控制器是一种控制芯片,多个设备的中断请求线同时连接到中断控制器上...
  • 中断服务程序执行顺序

    千次阅读 2021-01-05 19:54:45
    单级中断系统中,中断服务程序执行顺序: ①保护现场 ②中断事件处理 ③恢复现场 ④开中断中断返回
  • 第五章 中断和中断服务程序

    千次阅读 2012-12-26 14:07:48
    第五章 中断和中断服务程序 一,处理器与外围设备进行通信有两种方式:  1,轮询(效率低下)  2,中断 二,中断原理  当我们在敲击键盘的时候,键盘控制器会发送一个中断给处理器,告诉OS有中断产生,...
  • 中断发生如何执行到中断服务程序

    千次阅读 2017-08-14 22:39:28
    首先,PIC(可编程中断控制器)将...执行中断服务程序前,首先进行当前进程寄存器的压栈处理,软后向cseip装载中断服务程序的基址偏移,执行中断服务程序。 IDT表是可编辑的,一部分由内核初始化使用,一部分留给用户
  • linux 中断和中断处理程序

    千次阅读 2013-07-26 13:59:20
    在linux中中断的使用是无时不在,下面就自己的学习心得大家分享 一下!
  • 8086中断处理程序分析

    千次阅读 2017-09-02 14:50:41
    中断处理程序:由于cpu随时检测程序的中断信息,也就是执行中断程序,所以中断程序必须存储在内存某个段空间中 而中断处理程序的入口地址,即中断向量必须存储在对应的中断向量表表项中,通俗的讲就是中断处理程序的...
  • Linux内核之 中断以及中断处理程序

    千次阅读 2017-04-16 12:13:23
    人生若只如初见,何事秋风悲画扇。  --------纳兰容若 《木兰花令·拟古决绝词》 一、什么是中断:   linux管理所有的硬件设备,要做的第一...然而CPU的处理速度要远快于外围设备,总不能让CPU一直在等待外围设备
  • PIC单片机中断服务程序

    千次阅读 2017-08-03 20:48:55
    中断服务程序有一个特殊的定义方法: void interrupt ISR(void);其中的函数名“ISR”可以改成任意合法的字母或数字组合,但其入口参数返回参数类型必须是“void”型,亦即没有入口参数返回参数,且中间必须有一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 596,419
精华内容 238,567
关键字:

中断服务程序和中断处理程序