`
king_tt
  • 浏览: 2110309 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Linux内核设计与实现——7 中断与中断处理(8)——中断控制

 
阅读更多

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驱动初级——内核中断

    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内核源代码情景分析 (上下册 高清非扫描 )

    丛书名: Linux内核源代码情景分析 出版社:浙江大学出版社 目录 第1章 预备知识 1.1 Linux内核简介. 1.2 Intel X86 CPU系列的寻址方式 1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux...

    Linux2.6内核标准教程(共计8-- 第1个)

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...

    嵌入式设计及linux驱动开发指南——基于ARM9处理器.pdf

    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内核源代码的分析方法。第二个层次...

    Linux2.6内核标准教程(共计8--第7个)

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...

    Linux2.6内核标准教程(共计8--第8个)

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...

    深入理解Linux内核中文第三版——第4章 中断和异常

    《深入理解linux内核中文第三版》,高清晰扫描,真正中文第三版,对Linux 2.6内核进行了详细而细致的讲解。由于之前的压缩包分卷太多,现提供每一章的单独下载文件。100%高清晰第三版!

    Linux 2.6内核标准教程(部分)

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析;在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU这...

    Linux2.6内核标准教程(共计8--第6个)

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...

    Linux内核修炼之道 doc

    《Linux内核修炼之道》语言通俗易懂,内容覆盖了内核的学习方法到内核设计与实现等各方面内容,能够带领读者快速走入Linux内核的世界,适合对Linux内核学习茫然的初学者,也适合各类希望深入理解Linux内核的读者。

    Linux 内核-中断和系统调用.pdf

    北大计算机系考研资料 增补资料3:北大操作系统大题最长考内容——之中断和系统调用,一般的教材不包括,但重要且常考

    Linux2.6内核标准教程(共计8--第3个)

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析; 在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU...

    linux 2.6内核标准教程

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析;在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU这...

    Linux编程从入门到精通.rar

    ———————————————————————— 第二部分 Linux内核模块编程指南 第1章 Hello, World 第2章 字符设备文件 第3章 /proc文件系统 158 第4章 把/proc用于输入 162 第5章 把设备文件用于输入 170 第...

    《Linux内核修炼之道》精华版之方法论

    第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、文件系统以及设备驱动等主要部分,目的是希望读者以兴趣为导向,寻找一个子系统或模块,对其代码深入钻研和分析。第三个层次介绍...

    linux 内核源代码分析

    1. 1 Linux内核简介 1. 2 Intel X86 CPU系列的寻址方式 1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架...

    Linux系统系统内核分析系列_2 Linux的中断和异常处理

    中断向量代表的是中断源——从某种程度上讲,可以看作是中断或异常的类型。中断和异常的种类很多,比如说被0除是一种异常,缺页又是一种异常,网卡会产生中断,声卡也会产生中断,CPU如何区分它们呢?中断向量的概念...

    linux 2.6内核标准 part3/3

    然后对Linux内核的3大核心模块——内存管理、进程管理、中断和异常处理进行了深入的分析;在此基础上,对时间度量、系统调用进行了分析和讨论;最后讲解了Linux内核中常见的同步机制,使读者掌握每处理器变量和RCU这...

Global site tag (gtag.js) - Google Analytics