中断是设备驱动中非常重要的一个概念,所以这里首先讲述中断概念,然后讲述中断请求过程、中断处理程序以及中断相关的内核函数。
1中断基本概念
中断一词的字面意思是中间发生阻隔、停顿或故障而断开,但在计算机术语中的定义是是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件引起CPU暂时停止正在运行的程序,转到为该内部/外部事件或预先安排的事件服务的程序中去,服务完毕再返回去继续运行被暂时中断的程序,这个过程称为中断。Linux的中断通常分为两种:软中断和硬中断。注意,这里的软和硬的意思是指和软件相关以及和硬件相关,而不是软件实现的中断或硬件实现的中断。软中断就是通过“信号机制”实现的中断。Linux通过信号来产生对进程的各种中断操作,就目前所知的信号共有31个,这里就不一一列举。硬中断就是通常意义上的“中断处理程序”,它是直接处理由硬件发过来的中断信号的。当硬中断收到它应当处理的中断信号以后,就回去自己驱动的设备上去看看设备的状态寄存器以了解发生了什么事情,并进行相应的操作。对于软中断,主要是进程调度要做的事情,通常设备驱动的中断是指硬中断,所以我们这里讨论硬中断,即和硬件相关的中断。
2中断请求过程
发生中断,是因为外设需要通知操作系统它那里发生了一些事情,但是中断的功能仅仅是一个设备报警灯,当灯亮的时候中断处理程序只知道有事情发生了,但发生了什么事情还要亲自到设备那里去看才行。也就是说,当中断处理程序得知设备发生了一个中断的时候,它并不知道设备发生了什么事情,只有当它访问了设备上的一些状态寄存器以后,才能知道具体发生了什么,要怎么去处理。设备通过中断线向中断控制器发送高电平告诉操作系统它产生了一个中断,而操作系统会从中断控制器的状态位知道是哪条中断线上产生了中断。并不是每个设备都可以向中断线上发中断信号的,只有对某一条确定的中断线拥有了控制权,才可以向这条中断线上发送信号。由于计算机的外部设备越来越多,通常中断线是非常宝贵的资源。要使用中断线,就得进行中断线的申请,即IRQ(InterruptRequirement,中断请求),我们也常把申请一条中断线称为申请一个IRQ或者是申请一个中断号。IRQ是非常宝贵的,所以我们建议只有当设备需要中断的时候才申请占用一个IRQ,或者是在申请IRQ时采用共享中断的方式,这样可以让更多的设备使用中断。无论对IRQ的使用方式是独占还是共享,申请IRQ的过程都是一样的,分为3步:第1步,将所有的中断线探测一遍,看看哪些中断还没有被占用。从这些还没有被占用的中断中选一个作为该设备的IRQ。第2步,通过中断申请函数申请选定的IRQ,这是要指定申请的方式是独占还是共享。第3步,根据中断申请函数的返回值决定怎么做:如果成功了就可以正常工作,如果没成功或者重新申请或者放弃申请并返回错误。
3中断处理程序
Linux中的中断处理程序很有特色,它的一个中断处理程序通常分为两个部分:上半部(tophalf)和下半部(bottomhalf)。之所以会有上半部和下半部之分,完全是考虑中断处理的效率。上半部的功能是“登记中断”,当一个中断发生时,它就把设备驱动程序中中断例程的下半部挂到该设备的下半部执行队列中去,然后就等待新的中断的到来。这样一来,上半部执行的速度就会很快,它就可以接受更多它负责的设备产生的中断了。上半部之所以要快,是因为它是完全屏蔽中断的,如果它不执行完,其它的中断就不能被及时的处理,只能等到这个中断处理程序执行完毕以后。所以要尽可能多的对设备产生的中断进行服务和处理,中断处理程序就一定要快。但是,有些中断事件的处理是比较复杂的,所以中断处理程序必须多花一点时间才能够把事情做完。可怎样化解在短时间内完成复杂处理的矛盾呢,这时候Linux引入了下半部的概念。下半部和上半部最大的不同是下半部是可中断的,而上半部是不可中断的。下半部几乎做了中断处理程序所有的事情,因为上半部只是将下半部排到了他们所负责设备的中断处理队列中去,然后就什么都不管了。下半部一般所负责的工作是察看设备以获得产生中断的事件信息,并根据这些信息(一般通过读设备上的寄存器得来)进行相应的处理。由于下半部是可中断的,所以在它运行期间,如果其它的设备产生了中断,这个下半部可以暂时的中断掉,等到那个设备的上半部运行完了,再回头来运行它。但是有一点一定要注意,那就是如果一个设备中断处理程序正在运行,无论她是运行上半部还是运行下半部,只要中断处理程序还没有处理完毕,在这期间设备产生的新的中断都将被忽略掉。因为中断处理程序是不可重入的,同一个中断处理程序是不能并行的。
4中断相关函数
与Linux设备驱动程序中断处理相关的函数有申请和释放IRQ(中断请求)函数,即request_irq和free_irq,这两个函数在实际中非常重要,其函数原型如下,在头文件<include/linux/interrupt.h>文件中声明。
üintrequest_irq(unsignedintirq,irqreturn_t(*handler)(intirq,void*dev_id,structpt_regs*regs),unsignedlongflags,constchar*dev_name,void*dev_id);
该函数的作用是注册一个IRQ,其中参数irq是要申请的硬件中断号,参数handler是向系统登记的中断处理函数,是一个回调函数,中断发生时系统调用这个函数,参数dev_id是设备的ID,参数flags是中断处理的属性,若设置为SA_INTERRUPT,表明中断处理程序是FRQ(快速中断请求),FRQ程序被调用时屏蔽所有中断,而IRQ程序被调用时不屏蔽FRQ。若设为SA_SHIRQ,则多个设备共享中断,dev_id在中断共享时会用到。参数dev_name是定义传递给request_irq的字符串,用来在/proc/interrupts中显示中断的拥有者。
üvoidfree_irq(unsignedintirq,void*dev_id);
该函数的作用是释放一个IRQ,一般是在退出设备或关闭设备时调用。
üvoidenable_irq(unsignedintirq);
该函数的作用是打开一个IRQ,允许该IRQ产生中断。
üvoiddisable_irq(unsignedintirq);
该函数的作用是关闭一个IRQ,禁止该IRQ产生中断。
分享到:
相关推荐
Linux中断处理是操作系统核心的重要组成部分,它涉及到计算机系统对硬件事件的响应机制。这篇文档深入讲解了Linux系统中中断处理的细节,特别是中断源代码分析,对于理解和优化系统性能至关重要。 首先,我们要理解...
本文将详细讲解Linux中断的基本概念、类型、处理流程以及在ARM架构中的实现。 首先,中断是硬件向CPU发送的一个信号,表明发生了需要操作系统介入的事件,比如设备数据传输完成或外部事件发生。中断分为硬件中断和...
### Linux中断学习小结 #### 一、中断的基本概念与原理 中断是计算机硬件系统向处理器发出的一个信号,用于通知处理器某个外部事件已经发生。在Linux操作系统中,中断处理是核心的一部分,它允许系统响应外部事件...
通过上述分析,我们可以清楚地了解到ARM Linux中断处理的基本流程,包括异常向量表的设计、异常处理程序的位置无关编程策略以及`vector_irq`处理函数的具体实现。这些内容对于理解Linux内核如何高效、可靠地管理硬件...
#### 二、中断的基本概念 在Intel x86架构下,中断通常被分为同步中断和异步中断两大类。这两种类型的中断在触发方式上有着本质的区别: - **同步中断**:这种中断是由CPU自身在执行指令过程中产生的,例如访问...
1. **中断的基本概念** - 中断是一种异步通信方式,当硬件设备完成某个操作或需要CPU关注时,会向CPU发送中断信号。 - 中断向量是中断处理程序的地址和相应处理状态的组合,存储在中断描述符表(IDT)中。 - 每个...
本文将详细介绍中断的基本概念、分类、实现原理,以及与Linux内核的关系。 一、中断的定义 中断是指在CPU正常执行程序时,遇到内部或外部事件,CPU暂停当前程序,转而执行相应的服务程序,处理完事件后再返回原...
### Linux内核中断分析 #### 重要性及作用 中断系统是计算机系统中不可或缺的关键组件,在整个系统的运行中扮演着至关重要的角色...对于初学者而言,掌握中断的基本原理和处理流程是深入学习操作系统内核技术的基石。
### Linux中断处理详解 #### 基本概念与分类 中断是计算机系统中一个关键的概念,它是由硬件信号触发的事件,能够在程序执行的任意时刻发生。根据其特性,中断可以分为可屏蔽中断和不可屏蔽中断。可屏蔽中断可以...
#### 三、Linux中断处理机制 Linux内核中的中断处理主要包括两个层面:硬件层面和软件层面。硬件层面主要涉及与具体硬件相关的中断控制器的操作,而软件层面则负责处理这些中断并执行相应的中断服务程序。 #### 四...
以上就是S3C2440 Linux按键中断驱动的基本流程。在实际开发中,还需要考虑中断的同步问题、多按键处理、中断优先级以及中断延迟等问题。同时,为了测试驱动,我们可能需要编写一个简单的用户空间程序来读取按键状态...
在这个"linux_interrupt.rar"压缩包中,可能包含的是关于Linux中断处理程序的详细资料,帮助我们理解这个复杂的主题。 1. **中断的基本概念**: - 中断是一种异步信号,由硬件(如I/O设备)向CPU发送,通知CPU发生...
首先介绍了中断的一些基本概念,然后分 析了面向对象的 Linux 中断的组织形式、三种主要数据结构及其之间的关系。随后介绍了 Linux 处理异常和中断的基本流程, 在此基础上分析了中断处理的详细流程, 包括保存现场...
### Linux中断机制分析 #### 一、概述 ...本文详细介绍了Linux中断机制中的关键数据结构`irq_desc`,以及中断处理的基本流程和策略选择。理解这些概念有助于更好地开发和维护基于Linux的嵌入式系统。
本文通过详细探讨ARM架构下Linux 2.6内核中的中断和异常处理机制,不仅介绍了中断的基本概念、硬件机制,还深入分析了Linux 2.6内核如何初始化中断向量表并处理中断和异常的过程。这对于理解ARM平台上的嵌入式系统...
本文详细讲解了Linux下有中断端点的USB设备驱动的实现方法,包括USB设备驱动的基本概念、中断端点的概念、Linux下USB设备驱动的实现、信号量机制在USB设备驱动中的应用等方面的内容,为 readers 提供了一个系统的...
本文将深入探讨Linux中断处理的相关知识点,包括中断的基本概念、中断处理流程以及如何在Linux系统中实现中断处理。 首先,我们了解中断的基本概念。中断是一种异步信号,由硬件设备发起,通知CPU有紧急事件需要...
在Linux系统中,栈可以分为进程栈、线程栈、内核栈以及中断栈。 首先,我们需要了解栈(Stack)的基本概念。栈是一种后进先出(LIFO, Last In First Out)的数据结构,它允许数据被存储和检索,但只允许在一段称为...
在深入探讨Linux中断处理流程之前,首先需要了解ARM架构下的中断处理基本概念。ARM架构下,中断处理的核心在于**中断向量表**的构建与使用。当硬件检测到中断信号时,会根据不同的中断类型自动跳转至预先设置好的...