精华内容
下载资源
问答
  • 中断处理过程
    千次阅读
    2020-12-23 01:30:11

    一个完整的中断处理过程应该包括:中断请求、

    中断排队或中断判优、中断响应、中断处

    理和中断返回等环节,下面分别进行讨论。

    1

    .中断请求

    中断请求是由中断源向

    CPU

    发出中断请求信号。外部设备发出中断请求信号要具备以

    下两个条件:

    (

    1

    )外部设备的工作已经告一段落。例如输入设备只有在启动后,将要输入的数据送

    到接口电路的数据寄存器(即准备好要输入的数据)之后,才可以向

    CPU

    发出中断请求。

    (

    2

    )系统允许该外设发出中断请求。如果系统不允许该外设发出中断请求,可以将这

    个外设的请求屏蔽。

    当这个外设中断请求被屏蔽,

    虽然这个外设准备工作已经完成,

    也不能

    发出中断请求。

    2

    .中断排队

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

    CPU

    每次只能响应

    一断源的请求,

    那么究竟先响应哪一个中断源的请求呢?这就必须根据各中断源工作性质的

    轻重缓急,

    预先安排一个优先级顺序,

    当多个中断源同时申请中断时,

    即按此优先级顺序进

    行排队,等候

    CPU

    处理。一般是把最紧迫和速度最高的设备排在最优先的位置上。

    CPU

    先响应优先级别最高的中断源。当中断处理完毕,再响应级别低的中断申请。

    中断排队可以采用硬件的方法,

    也可以采用软件的方法。

    前者速度快,

    但需要增加硬设

    备;后者无需增加硬设备,但速度慢,特别是中断源很多时尤为突出。

    软件优用查询技术。当

    CPU

    响应中断后,就用软件查询以确定是哪些外设申请中断,

    并判断它们的优先权。一个典型的软件优先权排队接口电路如

    6

    10

    所示,图中把

    8

    外设的中断请求触发器组合起来,

    作为一具端口,

    并赋以设备号。

    把各个外设的中断请求信

    号相

    后,作为

    INTR

    信号,故其中任一外设有中断请求,都可向

    CPU

    送出

    INTR

    信号。

    CPU

    响应中断后,把中断寄存器的状态作为一个外设读入

    CPU

    ,逐位检测它们的状态,

    若哪一位为

    1

    ,则该位对应的外设有中断请求,应转到相应的服务程序的入口。其流程如图

    6

    11

    所示。

    更多相关内容
  • 中断处理过程

    2022-05-22 22:33:42
    中断过程指的是从中断源发出中断请求开始,CPU响应这个请求,现行程序中断,转至中断服务程序,直到中断服务程序执行完毕,CPU再返回原来的程序继续执行的整个过程。 步骤 请求中断→响应中断→关闭中断 保留...

    中断全过程指的是从中断源发出中断请求开始,CPU响应这个请求,现行程序被中断,转至中断服务程序,直到中断服务程序执行完毕,CPU再返回原来的程序继续执行的整个过程。

    步骤

    1. 请求中断→响应中断→关闭中断
    2. 保留断点
    3. 引出中断服务程序
    4. 保护现场
    5. 开启中断
    6. 执行中断服务程序
    7. 关闭中断
    8. 恢复现场
    9. 打开中断
    10. 中断返回

     2.保存断点:保证中断程序执行完能够回来继续执行后面的程序,其实保存的是程序计数器

    3.引出中断服务程序:其实就是读取我们要执行的程序的地址,以便一会去执行

    4.保存现场:保存寄存器中的数据,以便回来执行的时候恢复数据。为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容压入堆栈保护起来,再进入的中断处理。

    开中断和关中断:加锁

    • 将CPU不响应更高级中断请求

    • 在进入中断服务程序时, CPU已经自动禁止了本CPU上的中断响应,因为CPU不能假定中断服务程序是可重入的。

    • 如果在保存寄存器值时被中断了,那么另外的操作很可能就把寄存器改写了,现场无法恢复

    10.中断返回

    在中断服务子程序的最后要安排一条中断返回指令IRET,执行该指令,系统自动将堆栈内保存的IP/EIP和CS值弹出,从而恢复主程序断点处的地址值,同时还自动恢复标志寄存器FR或EFR的内容,使CPU转到被中断的程序中继续执行

    展开全文
  • 当进程发出一个系统调用的请求时,由应用态切换到内核态。这样的内核控制路径被成为进程内核路径,也叫进程...当CPU执行一个与中断有关的内核控制路径的时候,被成为中断上下文。中断的上半部和下半部都属于ISR上下文。
  • 这是一个操作系统实验课上的全部内容,这一实验为时钟中断处理程序和键盘中断响应程序.本次实验的内容为操作系统工作期间,利用时钟中断,在屏幕24行79列位置轮流显示’|’、’/’、’-’和’\’,适当控制显示速度...
  • 中断及中断处理过程

    千次阅读 2020-12-20 04:41:16
    中断及中断处理过程1. 中断和异常的概念区别Intel的官方文档里将中断和异常理解为两种中断当前程序执行的不同机制。这是中断和异常的共同点。不同点在于:中断(interrupt)是异步的事件,典型的比如由I/O设备触发;...

    中断及中断处理过程

    1. 中断和异常的概念区别

    Intel的官方文档里将中断和异常理解为两种中断当前程序执行的不同机制。这是中断和异常的共同点。不同点在于:

    中断(interrupt)是异步的事件,典型的比如由I/O设备触发;异常(exception)是同步的事件,典型的比如处理器执行某条指令时发现出错了等等。

    中断又可以分为可屏蔽中断和非可屏蔽中断,异常又分为故障、陷阱和异常中止3种,它们的具体区别很多书籍和官方文档都解释的比较清楚这里不再赘述。

    关于它们的区别有两点是需要注意的:

    1)平常所说的屏蔽中断是不包括异常的,即异常不会因为CPU的IF位被清(关中断,指令:cli)而受影响,比如缺页异常,即使关了中断也会触发CPU的处理。

    2)通常说的int 80h这种系统调用使用的中断方式实际上硬件上是理解为异常处理的,因此也不会被屏蔽掉,这也很好理解,int 80h这种中断方式是程序里主动触发的,对于CPU来说属于同步事件,因此也就属于异常的范畴。

    2. 中断(异常)处理过程

    需要明确的一点是CPU对于中断和异常的具体处理机制本质上是完全一致的,即:

    当CPU收到中断或者异常的信号时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理程序中,在完成对这个信号的处理后再跳回到刚才被打断的程序或任务中。这里只描述保护模式下的处理过程,搞清楚了保护模式下的处理过程(更复杂),实模式下的处理机制也就容易理解了。

    具体的处理过程如下:

    0)中断响应的事前准备:

    系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都知道得很清楚,才能正确地响应各种中断信号和异常。

    [a]系统将所有的中断信号统一进行了编号(一共256个:0~255),这个号称为中断向量,具体哪个中断向量表示哪种中断有的是规定好的,也有的是在给定范围内自行设定的。

    中断向量和中断服务程序的对应关系主要是由IDT(中断向量表)负责。操作系统在IDT中设置好各种中断向量对应的中断描述符(一共有三类中断门描述符:任务门、中断门和陷阱门),留待CPU查询使用。而IDT本身的位置是由idtr保存的,当然这个地址也是由OS填充的。

    [b]中断服务程序具体负责处理中断(异常)的代码是由软件,也就是操作系统实现的,这部分代码属于操作系统内核代码。也就是说从CPU检测中断信号到加载中断服务程序以及从中断服务程序中恢复执行被暂停的程序,这个流程基本上是硬件确定下来的,而具体的中断向量和服务程序的对应关系设置和中断服务程序的内容是由操作系统确定的。

    1)CPU检查是否有中断/异常信号

    CPU在执行完当前程序的每一条指令后,都会去确认在执行刚才的指令过程中中断控制器(如:8259A)是否发送中断请求过来,如果有那么CPU就会在相应的时钟脉冲到来时从总线上读取中断请求对应的中断向量[2]。

    对于异常和系统调用那样的软中断,因为中断向量是直接给出的,所以和通过IRQ(中断请求)线发送的硬件中断请求不同,不会再专门去取其对应的中断向量。

    2)根据中断向量到IDT表中取得处理这个向量的中断程序的段选择符

    CPU根据得到的中断向量到IDT表里找到该向量对应的中断描述符,中断描述符里保存着中断服务程序的段选择符。

    3)根据取得的段选择符到GDT中找相应的段描述符

    CPU使用IDT查到的中断服务程序的段选择符从GDT中取得相应的段描述符,段描述符里保存了中断服务程序的段基址和属性信息,此时CPU就得到了中断服务程序的起始地址。

    这里,CPU会根据当前cs寄存器里的CPL和GDT的段描述符的DPL,以确保中断服务程序是高于当前程序的,如果这次中断是编程异常(如:int 80h系统调用),那么还要检查CPL和IDT表中中断描述符的DPL,以保证当前程序有权限使用中断服务程序,这可以避免用户应用程序访问特殊的陷阱门和中断门[3]。

    4)CPU根据特权级的判断设定即将运行的中断服务程序要使用的栈的地址

    CPU会根据CPL和中断服务程序段描述符的DPL信息确认是否发生了特权级的转换,比如当前程序正运行在用户态,而中断程序是运行在内核态的,则意味着发生了特权级的转换,这时CPU会从当前程序的TSS信息(该信息在内存中的首地址存在TR寄存器中)里取得该程序的内核栈地址,即包括ss和esp的值,并立即将系统当前使用的栈切换成新的栈。这个栈就是即将运行的中断服务程序要使用的栈。紧接着就将当前程序使用的ss,esp压到新栈中保存起来。

    6)保护当前程序的现场

    CPU开始利用栈保护被暂停执行的程序的现场:依次压入当前程序使用的eflags,cs,eip,errorCode(如果是有错误码的异常)信息。

    官方文档[1]给出的栈变化的示意图如下:

    7)跳转到中断服务程序的第一条指令开始执行

    CPU利用中断服务程序的段描述符将其第一条指令的地址加载到cs和eip寄存器中,开始执行中断服务程序。这意味着先前的程序被暂停执行,中断服务程序正式开始工作。

    8)中断服务程序处理完毕,恢复执行先前中断的程序

    在每个中断服务程序的最后,必须有中断完成返回先前程序的指令,这就是iret(或iretd)。程序执行这条返回指令时,会从栈里弹出先前保存的被暂停程序的现场信息,即eflags,cs,eip重新开始执行。

    展开全文
  • 中断和中断处理程序1 中断2 中断处理程序3 注册中断处理程序4 编写中断处理程序共享的中断处理程序中断处理程序实例5 中断上下文6 中断处理机制的实现7 中断控制禁止和激活中断禁止指定中断线中断系统的状态 ...

    Linux内核要对连接到计算机上的所有硬件设备进行管理,要与它们进行通信。但是,处理器的速度跟外围硬件设备的速度往往不是一个数量级的,硬件的响应很慢,内核应该在此期间处理其他事物,等到硬件真正完成了请求的操作之后,再回过头来对它进行处理。中断机制让硬件在需要的时候再向内核发出信号,内核来处理硬件的请求。

    1 中断

    中断使得硬件得以与处理器进行通信。硬件设备生成中断的时候并不考虑与处理器的时钟同步,换句话说,中断随时都可以产生,因此,内核随时可能因为新到来的中断而被打断。

    从物理学的角度看,中断是一种电信号,由硬件设备生成,并直接送入中断控制器的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到此信号,便中断自己的当前工作转而处理中断。此后,处理器会通知操作系统已经产生中断,这样,操作系统就可以对这个中断进行适当的处理了。

    不同的设备对应的中断不同,而每个中断都通过一个唯一的数字标识,这些中断值通常被称为中断请求(IRQ)线。特定的中断总是与特定的设备相关联,并且内核要知道这些消息。

    异常

    异常与中断不同,它在产生时必须考虑与处理器时钟同步。异常也常称为同步中断。在处理器执行到由于编程失误而导致的错误指令的时候,或者是在执行期间出现特殊情况(例如缺页),必须靠内核来处理的时候,处理器就会产生一个异常。

    2 中断处理程序

    在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程(interrupt service routine,ISR)。产生中断的每个设备都有一个相应的中断处理程序。中断处理程序通常不是和特定设备关联,而是和特定中断关联的,也就是说,如果一个设备可以产生多种不同的中断,那么该设备就可以对应多个中断处理程序,相应的,该设备的驱动程序也就需要准备多个这样的函数。

    在Linux中,中断处理程序看起来就是普普通通的C函数,只不过这些函数必须按照特定的类型声明,以便内核能够以标准的方式传递程序的信息。中断处理程序与其他内核函数的真正区别在于:中断处理程序是被内核调用来响应中断的,而它们运行在我们称之为中断上下文的特殊上下文中。

    上半部与下半部的对比

    一般把中断处理切为两个部分,中断处理程序是上半部,接受到一个中断,它就立即开始执行,但只做有严格时限的工作,例如对接受的中断进行应答或复位硬件,这些工作都是在所有中断被禁止的情况下完成的。能够被允许稍后完成的工作会被推迟到下半部去。此后,在合适的时机,下半部就开中断执行,Linux提供了实现下半部的各种机制,下一篇文章会讨论,现在我们要记住上半部是中断处理程序,只做有严格时限的工作。

    3 注册中断处理程序

    中断处理程序是驱动程序的组成部分。每一设备都有相关的驱动程序,如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序。

    驱动程序可以通过下面的函数注册并激活一个中断处理程序:

    /* request_irq分配一个中断线 */
    int request_irq(unsigned int irq,
    				irqreturn_t (*handler)(int,void *,struct pt_regs *),
    				unsigned long irqflags,
    				const char * devname,
    				void *dev_id)
    

    第一个参数irq表示要分配的中断号。对某些设备,如传统PC设备上的系统时钟或键盘,这个值通常是预先定死的。而对于大多数其他设备,这个值要么是可以通过探测获取,要么可以通过编程动态确定。

    第二个参数handle是实际的中断处理程序。只要操作系统一接收到该中断,该函数就被调用。

    第三个参数irqflags可以为0,也可能是下列一个或多个标志的位掩码:

    • SA_INTERRUPT:此标志表明给定的中断处理程序是一个快速中断处理程序。在本地处理器上,快速中断处理程序在禁止所有中断的情况下运行
    • SA_SAMPLE_RANDOM:此标志表明这个设备产生的中断对内核熵池有贡献。内核熵池负责提供从各种随机事件导出的真正的随机数。
    • SA_SHIRQ:此标志表明可以在多个中断处理程序之间共享中断线。

    第四个参数devname是给中断相关的设备起的名字。这些名字会被/proc/irq和/proc/Interrupt文件使用,以便与用户通信。

    第五个参数dev_id主要用于共享中断线。如果无需共享中断线,那么将该参数赋值为NULL就可以了,但是,如果中断线是被共享的,那么必须传递唯一的信息,用来区分用的是共享中断线上的那个中断处理程序。实践中往往会通过它传递驱动程序的设备结构。

    request_irq()函数可能会睡眠,因此,不能在中断上下文或其他不允许阻塞的代码中用该函数,至于request_irq()会睡眠,那是在注册的过程中,内核需要在/proc/irq文件创建一个中断对应的项,会调用kmalloc()来请求分配内存,函数kmalloc()是可以睡眠的。

    在一个驱动程序中请求一个中断线,并在通过request_irq()注册中断处理程序:

    if(request_irq(irqn,my_interrupt,SA_SHIRQ,"my_device",dev))
    {
    	printk(KERN_ERR "my_device:connot register IRQ %d \n",irqn);
    	return -RIO;
    }
    

    irqn是请求的中断线,my_interrupt是中断处理程序,中断线可以共享,设备名为"my_device",而且我们通过dev_id传递dev结构体。

    释放中断处理程序

    卸载驱动程序时,需要注销相应的中断处理程序,并释放中断线。可以调用void free_irq(unsigned int irq,void *dev_id)来释放中断线。
    如果指定的中断线不是共享的,那么,该函数删除中断处理程序的同时将禁用这条中断线。如果中断线是共享的,则仅删除dev_id所对应的处理程序,而这条中断线本身只有在删除了最后一个程序程序时才会被禁用。

    4 编写中断处理程序

    以下是一个典型的中断处理程序声明:

    static irqreturn_t intr_handler(int irq,void *dev_id,struct pt_regs *regs);
    

    它的类型与request_irq()参数中handler所要求的参数类型相匹配。第一个参数irq就是这个中断处理程序要响应的中断的中断线号。第二个参数dev_id是用一个通用指针,它与中断处理程序注册时传递给request_irq()的采纳数dev_id必须一致,可以用来区分共享同一个中断处理程序的多个设备,最后一个参数regs是一个指向结构的指针,该结构包含处理中断之前处理器的寄存器和状态。除了调试的时候,它们很少使用到。

    中断处理程序的返回值是一个特殊类型:irqreturn_t。中断处理程序可能返回两个特殊的值,IRQ_NONE和IRQ_HANDLED。当中断处理程序检测到一个中断,但该中断对应的设备并不是在注册处理函数期间指定的产生源时,返回IRQ_NONE;当中断处理程序被正确调用,且确实是它所对应的设备产生的中断,返回IRQ_HANDLED。

    重入和中断处理程序

    Linux中的中断处理程序是无需重入的。当一个给定的中断处理程序在执行时,相应的中断线在所有处理器上都会被屏蔽掉,以防止在同一中断线上接受到另一个新的中断。

    共享的中断处理程序

    共享中断线的处理程序和非共享中断线的处理程序在注册和运行方式上比较相似,但主要有以下差异:

    • request_irq()的flags参数必须设置SA_SHIRQ标志
    • 对每个注册的中断处理程序来说,dev_id必须是唯一的。指向任意设备结构的指针就可以满足这一要求,通常会选择设备结构,因为它是唯一的,而且中断处理程序可能会用到它。不能共享就传NULL
    • 中断处理程序必须能区分它的设备是否真的产生了中断,

    中断处理程序实例

    让我们考察一个实际的中断处理程序,它来自RTC(real_time clock)驱动程序,可以在drivers/char/rtc.c中找到。RTC驱动程序装载时,rtc_init()函数会被调用,对这个驱动程序进行初始化。它的职责之一就是注册中断处理程序:

    /*
    	 * XXX Interrupt pin #7 in Espresso is shared between RTC and
    	 * PCI Slot 2 INTA# (and some INTx# in Slot 1). SA_INTERRUPT here
    	 * is asking for trouble with add-on boards. Change to SA_SHIRQ.
    	 */
    	if (request_irq(rtc_irq, rtc_interrupt, SA_INTERRUPT, "rtc", (void *)&rtc_port)) {
    		/*
    		 * Standard way for sparc to print irq's is to use
    		 * __irq_itoa(). I think for EBus it's ok to use %d.
    		 */
    		printk(KERN_ERR "rtc: cannot register IRQ %d\n", rtc_irq);
    		return -EIO;
    	}
    

    中断线号由rtc_irq指定,rtc_interrupt是我们的中断处理程序,驱动程序的名称为rtc,因为这个设备不允许共享中断线,且处理程序没有用到什么特殊的值,因此给dev_id的值是NULL。

    5 中断上下文

    当执行一个中断处理程序或下半部时,内核处于中断上下文中。进程上下文是一种内核所处的操作模式,此时内核代表进程执行,在进程上下文中,可以通过current宏关联到当前进程,此外,因为进程是以进程上下文的形式连接到内核的,因此,在进程上下文可以睡眠,也可以调用调度程序。

    中断上下文和进程并没什么瓜葛。因为没有进程的背景,所有中断上下文不可睡眠

    中断处理程序栈的设置是一个配置选项。它们共享所属中断进程的内核栈。内核栈的大小是两页。因为这种设置,中断处理程序共享别人的堆栈,所以它们从栈中获取内容非常节省空间。

    6 中断处理机制的实现

    中断处理在linux中的实现非常依赖体系结构,实现依赖于处理器、所使用的中断控制器的类型、体系结构的设计以及机器本身。
    下图是中断从硬件到内核的步骤。
    在这里插入图片描述
    设备产生中断,通过总线把电信号发送给中断控制器。如果中断线是激活的,那么中断控制器就会把中断发往处理器。在大多数体系结构中,这个工作就是通过电信号给处理器的特定管脚发送一个信号。除非在处理器禁止该中断,否则,处理器会立即停止它正在做的事,关闭中断系统,然后跳到中断处理程序的入口点去运行。

    对于每条中断线,处理器都会跳到对应的唯一的位置。这样,内核就可知道所接收中断的IRQ号了。入口点只是在栈中保存这个号,并存当前寄存器的值;然后,内核调用函数do_IRQ()。

    do_IRQ()的声明如下:

    unsigned int do_IRQ(struct pt_regs regs);
    

    因为C的调用惯例是要把函数参数放在栈的顶部,因此pt_regs结构包含原始寄存器的值,这些值是以前在汇编入口例程中保存在栈的的,中断的值也会得到保存,所以,do_IRQ()可以将它提取出来。

    计算出中断号后,do_IRQ()对所接收的中断进行应答,禁止这条线上的中断传递。do_IRQ()需要确保在这条中断线上有一个有效的处理程序,而且这个程序已经启动但是当前没有执行。如果是这样的话,do_IRQ()就调用handle_IRQ_event()来运行为这条中断线所安装的中断处理程序,在kernel/irq/handle.c文件中

    /*
     * Have got an event to handle:
     */
    fastcall int handle_IRQ_event(unsigned int irq, struct pt_regs *regs,
    				struct irqaction *action)
    {
    	int ret, retval = 0, status = 0;
    
    	if (!(action->flags & SA_INTERRUPT))
    		local_irq_enable();
    
    	do {
    		ret = action->handler(irq, action->dev_id, regs);
    		if (ret == IRQ_HANDLED)
    			status |= action->flags;
    		retval |= ret;
    		action = action->next;
    	} while (action);
    
    	if (status & SA_SAMPLE_RANDOM)
    		add_interrupt_randomness(irq);
    	local_irq_disable();
    
    	return retval;
    }
    

    7 中断控制

    Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了禁止当前处理器的中断系统,或屏蔽掉整个机器的一条中断线的能力,这些接口是与体系有关的,可以在<asm/system.h>和<asm/irq.h>中找到。

    禁止和激活中断

    用于禁止当前处理器(仅仅是当前处理器)上的本地中断,随后又激活它们的语句是:

    local_irq_disable();
    local_irq_enable();
    

    这两个函数通常以单个汇编指令来实现(取决于体系结构)。实际上,在x86中,local_irq_disable()仅仅是cli指令,而local_irq_enable()只不过是sti指令。

    local_irq_disable是禁止当前处理器上的所有中断,local_irq_enable是开启当前处理器上的所有中断,即使在禁止前有些中断是关闭的,在调用local_irq_enable()后也会被激活。所以我们需要一种机制把中断恢复到以前的状态而不是简单地禁止或激活。在禁止之前保存当前的中断系统,激活时恢复就行。

    unsigned long flags;
    lcoal_irq_save(flags)
    local_irq_restore(flags);
    

    flags必须是unsigned long类型。local_irq_save () 是保存本地中断传递的当前状态,然后禁止本地中断传递。local_irq_restore () 是恢复本地中断到flags的状态。

    禁止指定中断线

    在某些情况下,只禁止整个系统中一条特定的中断线就够了。为此,Linux提供了四个接口:

    void disable_irq(unsigned int irq);
    void disable_irq_nosync(unsigned int irq);
    void enable_irq(unsigned int irq);
    void synchronize_irq(unsigned int irq);
    

    disable_irq和disable_irq_nosync禁止中断控制器上指定的中断线,即禁止给定中断向系统中所有处理器的传递。我们来看看disable_irq的具体实现:

    /**
     *	disable_irq - disable an irq and wait for completion
     *	@irq: Interrupt to disable
     *
     *	Disable the selected interrupt line.  Enables and disables
     *	are nested.  This functions waits for any pending IRQ
     *	handlers for this interrupt to complete before returning.
     *	If you use this function while holding a resource the IRQ
     *	handler may need you will deadlock.
     *
     *	This function may be called - with care - from IRQ context.
     */
    void disable_irq(unsigned int irq)
    {
    	struct irqdesc *desc = irq_desc + irq;
    
    	disable_irq_nosync(irq);
    	if (desc->action)
    		synchronize_irq(irq);
    }
    

    此函数在返回之前等待中断irq的任何挂起的 中断处理程序完成。disable_irq会阻塞,所以不能在在中断处理函数中使用,如果在中断处理程序中使用,会导致死锁,电脑会死机。

    disable_irq_nosync不会阻塞,会立即返回,可在中断处理函数中使用。

    enable_irq函数的参数是int型变量,代表操作中断对应的中断号

    函数synchronize_irq等待一个特定的中断处理程序的退出,所以该函数也会阻塞。

    这些函数的调用都可以嵌套,但要记住在一条指定的中断线上,对disable_irq()或disable_irq_nosync()的每次调用,都需要相应地调用一次enable_irq()。只有在对enable_irq()完成最后一次调用后,才真正重新激活了中断线。例如,如果disable_irq()被调用了两次,那么直达第二次调用enable_irq()后,才能真正地激活中断线。

    禁止多个中断处理程序共享的中断线是不合适的。禁止中断线也就禁止了这条线上所有设备的中断传递。因此,用于新设备的驱动程序应该尽量不使用这些接口。

    中断系统的状态

    宏irqs_disable()定义在<asm/system.h>中,如果本地处理器上的中断系统被禁止,则它返回非0,否则返回0.
    在<asm/hardirq.h>中定义了的两个宏提供了一个用来检查内核的当前上下文的接口,它们是:

    in_interrupt();
    in_irq();
    

    in_interrupt用来检测内核是否处于中断上下文中,如果是的话,返回非0。说明此刻内核正在执行中断处理程序,或者正在执行下半段处理程序,如果返回0,此时内核处于进程上下文中。宏in_irq只有在内核确实正在执行中断处理程序时才返回非0.

    8 总结

    中断就是由硬件打断操作系统。内核提供的接口包括注册和注销中断处理程序,禁止中断,屏蔽中断线,以及检查中断系统的状态。
    因为中断打断了其他代码的执行(进程,内核本身,甚至其他中断处理程序),它们必须赶快执行完。为了大量的工作与必须快速执行完之间求得平衡,内核把处理中断的工作分为两部分。中断处理程序,也就是上半部,下半部我们还没有讨论。

    展开全文
  • 中断处理程序:在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序。产生中断的每一个设备都有一个相应的中断处理程序中断处理程序是被内核调用来响应中断的,他们运行于中断上下文中,该上下...
  • 展开全部1)中断e69da5e6ba903231313335323631343130323136353331333431366338响应的事前准备:系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序...
  • 中断程序中断处理程序

    千次阅读 2020-12-01 22:25:47
    中断程序中断处理程序 中断是指CPU接受到I/O设备发送的中断信号的一种响应。CPU会暂停正在执行的程序,保留CPU环境后自动转去执行该I/O设备的中断处理程序。执行完毕后回到断点。继续执行原来的程序。中断是由外部...
  • 完整的中断处理过程分为 1)中断响应的事前准备: 系统要想能够应对各种不同的中断信号,总的来看就是需要知道每种信号应该由哪个中断服务程序负责以及这些中断服务程序具体是如何工作的。系统只有事前对这两件事都...
  • 一种方式是使用轮训(polling)的方式,这种方式周期性地查看所有硬件设备的状态并做相应处理,这会造成很多不必要的系统开销。Linux内核使用中断的方式来管理硬件设备,中断本质上是一种电信号,设备通过和中断控制...
  • 中断处理程序与中断服务例程

    千次阅读 2017-07-20 11:27:21
    1 什么是中断2中断处理程序3中断服务例程4request_irq函数分析 1. 什么是中断 简单来说中断就是硬件设备与处理器的一种交流方式,比如当我按下一个键时,只有当处理器知道我按下了这个键并且做出相应...
  • 该示例提供了中断处理的详细代码,含驱动程序和应用程序。用户可以直接调用接口进行中断函数的处理。
  • 疑问: 1.设备,中断线,中断处理程序联系 2.中断上下文与进程上下文 3.中断子系统 总结
  • Linux中断和中断处理

    2021-01-09 15:38:55
    1.中断  #中断使得硬件得以发出通知给处理器,本质上是一种电信号  #中断随时能够产生。内核随时会被打断  #不同设备的中断不同,每一个中断都通过一...  #中断处理程序是硬件驱动程序的组成部分。假设设备使用
  • cpu执行int中断,实际上就相当于引发一个n号中断中断过程,他的大致执行过程如下: 取中断类型n 标志寄存器入栈,置IF=0,TF=0 (为什么要这一步,后面有解释) // 这一步可以模拟为 pushf //标志寄存器入栈 ;下面...
  • 有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套 ...
  • IRQ –编写中断处理程序的实用程序此板条箱提供用于在嵌入式设备上处理中断的实用程序。 请参考changelo IRQ –编写中断处理程序的实用程序。此板条箱提供了用于处理嵌入式设备上的中断的实用程序。 请参考更改日志...
  • 中断机构和中断处理程序

    千次阅读 2018-12-29 18:06:32
    什么是中断? 中断实际上是对信号做出的一种反应, 即CPU对I/O设备发来的中断信号的一种反应。是由外部设备引起的。俗称外中断。 在此插一嘴什么是陷入?...中断处理程序位于I/O系统的底层,直接与硬件进行交...
  • 中断处理的一般过程

    千次阅读 2021-07-03 22:00:18
    中断处理包括一下几个步骤: 1、中断请求 8088/8086CPU的NMI为边沿触发,INTR为电平触发。在中断请求被响应之前会一直发送中断请求。 2、中断源识别 当系统同时有多个中断源发出的中断请求时,系统往往只能相应...
  • 中断处理 - 操作系统

    千次阅读 2022-03-20 11:07:21
    3、中断处理中断处理程序是被内核调用来响应中断的,它运行在中断上下文。 补充: 对Linux内核中进程上下文和中断上下文的理解 内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间...
  • 中断处理程序及设备驱动程序 中断是指CPU在执行一个程序时,对系统中发生的某个事件做出的一个反应,它在操作系统中有着重要的有着重要的地位,时多道程序得以实现的基础。 引入缓冲区的原因: 外部中断:简称...
  • 第7章中断处理程序

    千次阅读 2018-09-17 20:40:11
    7.2 中断处理程序 在响应一个特定中断的时候,内核会执行一个函数,该函数叫做中断处理程序或中断服务例程。产生中断的每个设备都有一个相应的中断处理程序。例如,由一个函数专门处理来自系统时钟的中断,而另外一...
  • 中断处理流程

    2022-03-09 10:57:36
    中断处理分为3个过程 ,准备,执行,收尾 保护现场:将各寄存器的内容压入堆栈保存 判断中断:是否能够中断切换 开中断:允许高级版中断,实现中断嵌套 中断处理:跳转到中断处理代码处 中断控制器中有一个...
  • 中断挂起的概念: 1. 因为某种原因,中断不能马上执行,所以“挂起”等待。 2. 等程序可以中断,在执行“响应挂起的... 比如有高、低级别的中断同时发生,就挂起低级别中断,等高级别中断程序执行完,在执行低级别中断
  • 8086中断处理过程

    千次阅读 2020-04-09 09:25:53
    当外设向CPU发送可屏蔽中断请求: 1)8259中断控制器通过INTR信号线发送高电屏请求信号 2)CPU在每执行一条指令的最后一个时钟周期时会采样INTR信号线判断有无新的中断请求,如果INTR标志为1(也就是有中断请求)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 581,488
精华内容 232,595
关键字:

中断处理过程