COPY FROM:http://zhan.renren.com/qdlinux?gid=3602888498000980107&from=post&checked=true

研究linux系统,不管是做驱动、协议栈还是进程调度等等,都离不开中断。这说明,要想编写正确的linux代码,不了解中断是不行的。

话说曾几何时,在大学的课堂里,老师滔滔不绝的讲解中断,说中断可以嵌套,说中断有优先级,那么linux操作系统是不是中断嵌套?是不是按优先级嵌套?

其实大家应该可以猜到了,并不完全是的。因为老师讲的是理论,linux是现实,这两者是很难相同的。就像小时候要当科学家,结果长大了发现自己天天在搬砖。

现在回到正轨上来,通过下面几个问题的讲解,大家就可以对linux的中断有个整体上的了解。

硬件平台:x86

操作系统版本:linux-2.6.24

1.什么时硬中断,什么是软中断?

硬中断:是由与系统相连的外设(比如:网卡、硬盘)自动产生的。主要是用来通知操作系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。

软中断:我们知道,为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理时间比较长的工作,放到中断之后来完成,也就是软中断中来完成。

2.不同的硬中断是否可以嵌套?相同的硬中断是否可以嵌套,以及是否按优先级嵌套?硬中断最多可能嵌套几级?

Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但是同种中断不会打断同种中断的执行。

但是并不是所有的中断都是可以被打断的,这需要看注册的中断函数是否设置了IRQF_DISABLED,如果设置了IRQF_DISABLED,那么硬中断处理的时候是不允许被打断的,否则是允许被打断的。Peter Zijlstra在2009.3的一个讨论中关于IRQF_DISABLED的使用问题(详见http://lwn.net/Articles/321663/)。

从代码的角度上来说中断嵌套发生的位置:

硬件中断-->do_IRQ-->handle_IRQ_event-->handler。 在硬件中断到handle_event_irq之间,由于发生中断的时候CPU会自动屏蔽中断,所以在这中间是不会发生中断嵌套的,但是在handle_event_irq中,可能会重新开启中断,也就是说在handler中是可以发生中断嵌套的。

同种中断不会嵌套的实现:

linux通过一个标志位IRQ_INPROGRESS来实现。当中断类型A的一个中断A1处理的时候,linux会在do_IRQ中,handle_IRQ_event之前,置位A类型中断的IRQ_INPROGRESS位。当A1中断在handle_IRQ_event中被同种类型的中断A2到达,会调用do_IRQ,然后发现A类型中断的IRQ_INPROGRESS,就会置位IRQ_PENDING后返回,不会嵌套执行。

由于同种类型的中断不会嵌套,所以最多可能的嵌套级数,就是未设置IRQF_DISABLED中断类型的个数。(是否还有其他的限制,没有详细的研究)

3.不同的软中断是否可以嵌套?相同的软中断是否可以嵌套?

软中断的调用是通过do_softirq()来激活的。

同种类型的软中断,不可以嵌套执行。但是不同的CPU上,可以同时运行相同类型的软中断。

4.软中断在什么时间点被调度?

(1)内核显示的允许软中断的时候 local_bh_enable

(2)irq_exit()的时候

(3)ksoftirqd进程被唤醒的时候

(4)其他可能的地方(这里没有详细的追究)

让你了解x86的中断的更多相关文章

  1. 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用

    资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...

  2. Linux虚拟地址空间布局以及进程栈和线程栈总结【转】

    转自:http://www.cnblogs.com/xzzzh/p/6596982.html 原文链接:http://blog.csdn.net/freeelinux/article/details/ ...

  3. Linux虚拟地址空间布局以及进程栈和线程栈总结

    原文链接:http://blog.csdn.net/freeelinux/article/details/53782986[侵删] 本文转自多个博客,以及最后有我的总结.我没有单独从头到尾写一个总结的 ...

  4. XV6锁

    锁 xv6 运行在多处理器上,即计算机上有多个单独执行代码的 CPU.这些 CPU 操作同一片地址空间并分享其中的数据结构:xv6 必须建立一种合作机制防止它们互相干扰.即使是在单个处理器上,xv6 ...

  5. 【摘】Linux虚拟地址空间布局以及进程栈和线程栈总结

    在CSDN上看到的一篇文章,讲的还是满好的. 原文地址:Linux虚拟地址空间布局以及进程栈和线程栈总结 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个 ...

  6. xenomai内核解析之双核系统调用(一)

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 xenomai 内核系统调用 一.32位Lin ...

  7. 【xenomai内核解析】系列文章大纲

    xenomai内核解析 本博客为本人学习linux实时操作系统框架xenomai的一些记录,主要剖析xenomai内核实现,以及与linux相关的知识.方便读者定位具体文章,现列出本博客大纲,后续会陆 ...

  8. iommu分析之---intel irq remap框架实现

    背景介绍: IRQ域层级结构: 在某些架构上,可能有多个中断控制器参与将一个中断从设备传送到目标CPU. 让我们来看看x86平台上典型的中断传递路径吧 Device --> IOAPIC -&g ...

  9. 【翻译】运行于x86机器上的FreeBSD的PCI中断

    来源 http://people.freebsd.org/~jhb/papers/bsdcan/2007/article/article.html 摘要 在拥有多个独立设备的计算机里一个重要的元素是一 ...

随机推荐

  1. OJ网站程序员必备

    一. Online Judge简介: Online Judge系统(简称OJ)是一个在线的判题系统.用户可以在线提交程序多种程序(如C.C++.Pascal)源代码,系统对源代码进行编译和执行,并通过 ...

  2. 常见前端面试题之HTML/CSS部分

    转自http://www.cnblogs.com/jscode/archive/2012/07/10/2583856.html Doctype是什么?如何触发严格模式与混杂模式模式?区分它们有何意义? ...

  3. iPad横屏模式研究

    在iPad应用开发时如何让设备只支持横屏(landscape)模式,我做了多次尝试,并没有发现比较简捷的设置方法.我尝试了大概大概3种方式. 1.通过XCode设置“iPad Deployment i ...

  4. 用于主题检测的临时日志(d94169f9-f1c0-45a2-82d4-6edc4bd35539 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

    这是一个未删除的临时日志.请手动删除它.(5327dce0-d2d1-4fba-8801-d3ff67564a96 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)

  5. matlab实现贝塞尔曲线绘图pdf查看

    贝塞尔曲线绘图方法: %Program 3.7 Freehand Draw Program Using Bezier Splines %Click in Matlab figure window to ...

  6. [原]项目进阶 之 持续构建环境搭建(三)Maven环境搭建

    上次的博文项目进阶 之 持续构建环境搭建(二)Nexus私服器中,我们搭建了一个Nexus的maven私服,这次我们来重点讲解一下Maven的安装和配置.这里说明一下这次的环境搭建,比较基础,但却非常 ...

  7. 微软职位内部推荐-Enterprise Architect - BDE - BJ

    微软近期Open的职位: Enterprise ArchitectCloud, HTML5, Big Data and Mobile are technology trends driving pro ...

  8. office365 development

    Introduction to Office 365 Development http://www.microsoftvirtualacademy.com/training-courses/intro ...

  9. cocos2dx中的设计分辨率与屏幕适配策略

    1.首先明确几个概念: 设计分辨率:designResolution,即资源图片的设计尺寸,即美工给你的资源图片的大小,比如(641*964) 屏幕分辨率:又叫帧的大小,glview->setF ...

  10. C#中使用SelectionStart属性指定输入框光标位置

    今天工作中遇到一个小BUG需要修改,需求为在文本框输入的过程中,如果数字是以0开头则自动消除0 如输入012,则显示12 很容易想到在textbox的text changed事件中判断,如果text是 ...