博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux中断研究
阅读量:6982 次
发布时间:2019-06-27

本文共 1526 字,大约阅读时间需要 5 分钟。

hot3.png

研究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)其他可能的地方(这里没有详细的追究)

原文:

转载于:https://my.oschina.net/u/2407990/blog/538989

你可能感兴趣的文章
checkbox全选/全不选,子复选框全选父复选框选中
查看>>
12.2第一周总结
查看>>
nginx-2-nginx的反向代理
查看>>
vim编辑器
查看>>
Constructor&object 的联系与区别
查看>>
Mysql--变量
查看>>
单引号插入数据库
查看>>
Oracle备份和恢复
查看>>
bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序
查看>>
bzoj千题计划157:bzoj1220:[HNOI2002]跳蚤
查看>>
bzoj千题计划212:bzoj1864: [Zjoi2006]三色二叉树
查看>>
Android开发之ProgressDialog在独立Thread线程中更新进度
查看>>
Objective-C内存管理机制
查看>>
数据结构化与保存
查看>>
图片内容保存到数据库,并从数据库里获取图片
查看>>
a标签的link、visited、hover、active的顺序
查看>>
SQL系列(四)—— 唯一值(distinct)
查看>>
《数据结构》例1.3
查看>>
堆和栈的区别 (转贴)
查看>>
OpenSSL s_server / s_client 应用实例
查看>>