Linux内核提供了一组接口用于操作机器上的中断状态。这些接口为我们提供了能够禁止当前处理器的中断系统,或屏蔽掉整个机器的一条中断线的能力。这些例程都是与体系无关的,可以在<asm/system.h>和<asm/irq.h>中找到。
一般来说控制中断系统的原因归根结底是需要提供同步。通过禁止中断,可以确保某个中断处理程序不会抢占当前的代码。此外,禁止中断还可以禁止内核抢占。
锁提供的保护机制,防止来自其它处理器的并发访问,而禁止中断提供的保护机制,则是防止其它中断处理程序的并发访问。
1)操作当前处理器的本地中断:
禁止:local_irq_disable()
激活:local_irq_enable()
如果在调用local_irq_disable()之前已经禁止了中断,那么往往会带来潜在的危险,同样,响应的local_irq_enable()也存在潜在的危险。因此,禁止中断之前保存中断系统的状态会更加安全一些,相反,在准备激活中断时,只需要把中断恢复到他们之前的状态。
unsignedlong flags;
local_irq_save(flags);// 保存状态:
……//禁止中断
local_irq_restore(flags);//恢复状态
对于local_irq_save(flags)和local_irq_restore(flags)的调用必须在同一个函数中进行。
2)以前的内核中提供了一种“能够禁止系统中所有处理器上的中断”方法,这个函数是cli(),响应的激活函数是sli()。这些接口在2.5版本开发期间被取消了。取消全局cli()有不少优点。首先,强制驱动程序编写者实现真正的加锁。要知道具有特定目的的细粒度锁比全局锁要快许多,而且也完全吻合cli()的设计初衷。其次,这也使得很多代码更具流线型,避免了代码的成簇布局。所以,由此得到的中断系统更简单也更易于理解。
3)在某些情况下,我们只需要禁止整个系统的一条特定的中断线就够。linux提供了4个接口:
voiddisable_irq(unsign int_irq);//禁用中断线, 等待
voiddisable_irq_nosync(unsignint_irq);//禁用中断线,不等待
voidensable_irq(unsign int_irq);//激活中断线
voidsynchronize_irq(unsignint_irq);//等待特定中断处理程序退出
前两个函数禁止中断控制器上指定的中断线,即禁止指定的中断向系统中所有处理器传递。其中,第一个函数只有在当前正在执行的所有处理程序(该中断线的中断处理程序)完成后,才会返回。而第二个函数则直接返回,不进行等待。第四个函数用于等待一个特定的中断处理程序的退出。
这些函数的调用可以嵌套。但记住,每调用一次禁用就要调用一次激活,只有当最后一次激活被调用后,这条中断线才真正地被激活了。
禁止多个中断处理程序共享的中断线是不合适的。因为这样就禁止了这条线上得所有设备的中断传递。因此新的驱动程序倾向于不使用这些接口。
4)
irq_disable()查询中断状态,是禁止还是激活。如果本地处理器上的中断系统被禁止,它返回非0,否则返回0
in_interrupt(),如果内核处于任何类型的中断处理中(包括中断处理程序和下半部),它返回非0,否则返回0
in_irq()只有内核确实在执行中断处理程序(不包含下半部),才返回非0.
如果in_interrupt()返回0,则此刻内核处于进程上下文中。
分享到:
相关推荐
Linux 内核需要对连接到计算机上的所有硬件设备进行管理,毫无疑问这是它的份内事。 如果要管理这些设备,首先得和它们互相通信才行,一般有两种方案可实现这种功能: l 轮询(polling) 内核定期对设备的状态进行...
1.2 Linux的线程——轻量级进程 15 1.3 进程的创建——do_fork()函数详解 19 1.4 执行进程间切换 33 1.4.1 进程切换之前的工作 33 1.4.2 进程切换实务 —— switch_to宏 37 1.4.3 __switch_to函数 39 1.5 fork与...
丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux...
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...
9.1.2 Linux内核对USB规范的支持 9.1.3 OHCI简介 9.2 Linux下USB系统文件结点 9.3 USB主机驱动结构 9.3.1 USB数据传输时序 9.3.2 USB设备连接/断开时序 9.4 主要数据结构及接口函数 9.4.1 数据传输管道 ...
LINUX内核修炼之道完整版; 本书重点介绍Linux内核工作原理以及学习方法。将Linux内核的修炼之道总结为四个层次:第一层次目的是对Linux以及内核有个全面的认识和了解,掌握Linux内核源代码的分析方法。第二个层次...
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...
《深入理解linux内核中文第三版》,高清晰扫描,真正中文第三版,对Linux 2.6内核进行了详细而细致的讲解。由于之前的压缩包分卷太多,现提供每一章的单独下载文件。100%高清晰第三版!
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析;在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU这...
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...
《Linux内核修炼之道》语言通俗易懂,内容覆盖了内核的学习方法到内核设计与实现等各方面内容,能够带领读者快速走入Linux内核的世界,适合对Linux内核学习茫然的初学者,也适合各类希望深入理解Linux内核的读者。
北大计算机系考研资料 增补资料3:北大操作系统大题最长考内容——之中断和系统调用,一般的教材不包括,但重要且常考
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析;在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU这...
———————————————————————— 第二部分 Linux内核模块编程指南 第1章 Hello, World 第2章 字符设备文件 第3章 /proc文件系统 158 第4章 把/proc用于输入 162 第5章 把设备文件用于输入 170 第...
第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、文件系统以及设备驱动等主要部分,目的是希望读者以兴趣为导向,寻找一个子系统或模块,对其代码深入钻研和分析。第三个层次介绍...
1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架...
中断向量代表的是中断源——从某种程度上讲,可以看作是中断或异常的类型。中断和异常的种类很多,比如说被0除是一种异常,缺页又是一种异常,网卡会产生中断,声卡也会产生中断,CPU如何区分它们呢?中断向量的概念...
然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析;在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU这...