让你了解x86的中断
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的中断的更多相关文章
- 《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
资源 OS2018Spring课程资料首页 uCore OS在线实验指导书 ucore实验基准源代码 MOOC OS习题集 OS课堂练习 Piazza问答平台 暂时无法注册 疑问 为什么用户态和内核态 ...
- Linux虚拟地址空间布局以及进程栈和线程栈总结【转】
转自:http://www.cnblogs.com/xzzzh/p/6596982.html 原文链接:http://blog.csdn.net/freeelinux/article/details/ ...
- Linux虚拟地址空间布局以及进程栈和线程栈总结
原文链接:http://blog.csdn.net/freeelinux/article/details/53782986[侵删] 本文转自多个博客,以及最后有我的总结.我没有单独从头到尾写一个总结的 ...
- XV6锁
锁 xv6 运行在多处理器上,即计算机上有多个单独执行代码的 CPU.这些 CPU 操作同一片地址空间并分享其中的数据结构:xv6 必须建立一种合作机制防止它们互相干扰.即使是在单个处理器上,xv6 ...
- 【摘】Linux虚拟地址空间布局以及进程栈和线程栈总结
在CSDN上看到的一篇文章,讲的还是满好的. 原文地址:Linux虚拟地址空间布局以及进程栈和线程栈总结 一:Linux虚拟地址空间布局 (转自:Linux虚拟地址空间布局) 在多任务操作系统中,每个 ...
- xenomai内核解析之双核系统调用(一)
版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 目录 xenomai 内核系统调用 一.32位Lin ...
- 【xenomai内核解析】系列文章大纲
xenomai内核解析 本博客为本人学习linux实时操作系统框架xenomai的一些记录,主要剖析xenomai内核实现,以及与linux相关的知识.方便读者定位具体文章,现列出本博客大纲,后续会陆 ...
- iommu分析之---intel irq remap框架实现
背景介绍: IRQ域层级结构: 在某些架构上,可能有多个中断控制器参与将一个中断从设备传送到目标CPU. 让我们来看看x86平台上典型的中断传递路径吧 Device --> IOAPIC -&g ...
- 【翻译】运行于x86机器上的FreeBSD的PCI中断
来源 http://people.freebsd.org/~jhb/papers/bsdcan/2007/article/article.html 摘要 在拥有多个独立设备的计算机里一个重要的元素是一 ...
随机推荐
- Oracle 的证也会过期咯
How does this recertification requirement affect me? If your Database Certification credential is re ...
- 通过Linux命令过滤出binlog中完整的SQL语句
DB:5.6.16CentOS:CentOS release 6.3 (Final) 当insert语句通过空格跨行输入的时候,如何提取完整的insert语句! 创建一个空表:mysql> cr ...
- [MVC] - 异步调用后台的常用方法。
1. 直接调用Action @Html.Action("GetTopArticle", "Home") 2. 通过url, 并用Jquery异步加载. < ...
- AVPlayer的基本使用
2014-5-7 06:46| 发布者: admin| 查看: 437| 评论: 0 摘要: 在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要 ...
- Python实战(1)
此次实战完全按照Python教程 - 廖雪峰的官方网站进行 首先下载windows版本的Python2.7,附上下载链接http://www.python.org/ftp/python/2.7.6/p ...
- VB 思维导图总结(三)
续上篇.vb总结之“思维导图”(2) 第十章.绘制图形 第十一章.数据库技术... 第十二章.总结! 相信有了vb的一个基础,应对接下来的学习会顺畅些.加油!
- 微软职位内部推荐-Android Developer
微软近期Open的职位: Position: SDE II or Senior SDE -- Mobile Products Android/WP Contact Person: Winnie Wei ...
- Most People Aren’t.
Most people want to be fit, most people aren't. Most people want to build a successful business, mos ...
- angular入门系列教程3
主题: 本篇主要目的就是继续完善home页,增加tab导航的三个页index index1 index2 效果图: 细节: 初始化的JS就是咱们的home.js,仔细来看. angular的route ...
- 2014 Multi-University Training Contest 3
官方解题报告http://blog.sina.com.cn/s/blog_a19ad7a10102uyiq.html Wow! Such Sequence! http://acm.hdu.edu.cn ...