中断,通常被定义为一个事件。打个比方,你烧热水,水沸腾了,这时候你要去关掉烧热水的电磁炉,然后再去办之前手中停不下来的事情。那么热水沸腾就是打断你正常工作的一个信号机制。当然,还有其它的情况,我们以后再做分析。

中断也就是这样产生的,中断分为同步中断还有异步中断。

同步中断在Intel的手册中被称为异常,而异步中断被称作中断。打个比方在ARM处理器的异常种类就有不少,有未定义指令异常,软中断异常,快中断异常等等。异常是由程序错误产生的,或者是内核必须处理的异常条件产生的。如果你曾经学过单片机,那么你一定会清楚,51单片机的P32,P33是外部中断0和1,假设当你在程序中开启了外部中断0,然后在中断中执行了相应的程序,这时你在外部中断0的一脚连接一个按键,这时候你按下去P30这个引脚就会产生一个中断。那么中断服务程序就会响应你的操作,比如点亮一个LED灯,或者说蜂鸣器叫一下等等。

那么在linux内核中的中断其实也是和单片机类似的,只不过linux内核的中断定义的比较丰富,但是基本思想还是一样的。linux内核处理中断有一种叫做中断信号的机制。它的作用就是当一个中断信号到来时,CPU必须停止它当然正在做的事情,然后切换到一个新的活动,为了做到这一点,内核态堆栈保存的程序计数器的当前值,其实就是eip和cs寄存器的存储数据,然后把中断相关类型的一个地址放到一个程序计数器当中去。

其实在内核中,中断这样的切换机制很像进程的调度,上下文切换这样的机制,但是依然存在着一个非常明显的差异,那就是中断或者异常在处理的代码并不是一个进程。

中断信号的来临必将会引起中断的处理,那么中断处理必须要满足以下的约束:

1、linux内核在响应中断以后必须要进行的操作分为两部分:我们把非常重要的,非常紧急的处理程序让内核立即去运行。剩下的有延时的部分就让它后面再去执行。这样也就验证了水沸腾,而人停下手中的事去关电磁炉,再回去做他的事一样的道理。

2、中断编写的程序必须编写成可以使内核控制的路径能以嵌套的方式来执行,或者说,当最后一个内核控制路径终止的时候,内核必须能恢复被中断进程的执行,或者说,中断信号已经导致了进程重新调度,内核能切换到另外一个进程。这是我们分析的另外一种情况,水开了,人去关电磁炉,然后人接着做事,这是第一种情况。水开了,人去关电磁炉,接下来门铃响了,客人来了,你必须去迎接客人,然后就打断了你之前在做的事情,也就是客人来了打断了你正在做的这件事进入到与陪客的阶段。

3、在临界区中,中断必须要被禁止。临界区其实就是加锁和去锁的实现。程序员将非常关键的步骤放进临界区,就是为了防止中断或者其它的信号去影响到它,其实在内核中这样的步骤是有必要的。临界区的代码必须在短时间内被执行,而不应该出现延时的操作,且必须尽可能的去限制这样的临界区,因为,内核在处理中断程序的时候,应该是在大部分时间以开中断的方式去运行。

在intel的文档中,中断和异常通常分为几类:中断有可屏蔽的,不可屏蔽的。异常有处理器探测异常,这就包括故障的产生,陷阱,异常的中止,还有编程异常的状况。每个中断和异常都是由0-255之间的一个数来标识。intel管这东西叫向量。

其实在ARM中就有那么一张表叫异常向量表,那就是我刚刚文章里说过的那几个。

在linux中也有这么一张表:

Linux内核中断和异常分析(上)的更多相关文章

  1. Linux内核中断和异常分析(中)

    在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线.所有现在存在的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连,上次讲到单片机的时候,我就讲到了单片机 ...

  2. Linux内核中断和异常分析(下)

    这节,我们继续上,中(以前的日志有)篇目进行分析,结合一个真实的驱动案例来描述linux内核中驱动的中断机制,首先我们先了解一下linux内核中提供的中断接口. 这个接口我们需要包含一个头文件:#in ...

  3. Linux 内核中断内幕

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-linuxkernelint/index.html#resources Linux 内核中断内幕 ...

  4. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上 ...

  5. Linux内核态抢占机制分析(转)

    Linux内核态抢占机制分析  http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html 摘 要]本文首先介绍非抢占式内核(Non-Preemptive ...

  6. Linux内核哈希表分析与应用

        目录(?)[+]   Linux内核哈希表分析与应用 Author:tiger-johnTime:2012-12-20mail:jibo.tiger@gmail.comBlog:http:// ...

  7. Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

  8. Linux内核--网络栈实现分析(十一)--驱动程序层(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地 ...

  9. Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地 ...

随机推荐

  1. iOS7编程Cookbook中例15.8中一个小问题

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该书的15.8例子标题为Editing Videos on a ...

  2. Storm并发机制详解

    本文可作为 <<Storm-分布式实时计算模式>>一书1.4节的读书笔记 在Storm中,一个task就可以理解为在集群中某个节点上运行的一个spout或者bolt实例. 记住 ...

  3. Mac下安装Homebrew并升级subversion

    1. 切 Tencent-GuestWiFi2. $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/ins ...

  4. Ubuntu下安装GTK环境

    要生成C图形界面的程序,得安装GTK环境     安装GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包.除此之外还要转一些其他的  东西,如libglib2.0 ...

  5. 关于tomcat中Servlet对象池

    Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端 ...

  6. 使用TT模板+mvc+wcf实现简单查询

    今天是除夕,小编的这篇博客是掐着点儿发的,在此,祝各位小伙伴新年快乐,身体健康,万事如意:喜从天降,欣喜若狂:喜气盈门,好事成双:好人好运,金玉满堂:神采飞扬,如愿以偿,财源滚滚来,福如东海长:伴随着 ...

  7. 学习TensorFlow,浅析MNIST的python代码

    在github上,tensorflow的star是22798,caffe是10006,torch是4500,theano是3661.作为小码农的我,最近一直在学习tensorflow,主要使用pyth ...

  8. MyBatis进阶(一)运行原理

    初次学习MyBatis,自己花了不少时间,理解一件事物是需要时间的.经过多次反复的理解,你的认知能力就可以得到提升.以下是学习MyBatis的一些理解认识,技术理解上若有不当之处,敬请朋友们提出宝贵意 ...

  9. UE4 射线拾取&三维画线

    虽然有人建议UE4使用C++创建VR项目,能避免一些坑爹的错误,但是我用C++创建,竟然问题更多,还存在创建不了的情况,也不知道是不是我的操作问题,快疯了. 于是我还是选择了蓝图创建VR项目,但是.. ...

  10. 读外部存储的权限READ_EXTERNAL_STORAGE

    READ_EXTERNAL_STORAGE Added in API level 16 String READ_EXTERNAL_STORAGE Allows an application to re ...