寄托天下
查看: 3497|回复: 11
打印 上一主题 下一主题

[编程天地] WINDOWS与LINUX中的中断处理比较 [复制链接]

Rank: 11Rank: 11Rank: 11Rank: 11

声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1795

荣誉版主 GRE斩浪之魂 Golden Apple

跳转到指定楼层
楼主
发表于 2010-4-8 03:23:33 |只看该作者 |倒序浏览
WINDOWSLINUX中的中断处理比较

最近刚好分别看了WINODWSLINUX中的中断处理部分,趁着还没忘记,把感想写下来方便以后查询。

一.不同之处:

WINDOWS中,有一个IRQL(注意不是IRQ)的概念。最早的时候,我以为是CPU设计里就包括了这个东东。后来看INTELCPU手册,发现似乎没有。最近又看了一遍WINDOWSINTERALS 4TH。感觉这个东西应该是包括在PICOR APIC里面的(关于APIC,可以看我以前的帖子)。对于X86-32,硬件设备的IRQIRQL之间的关系是:IRQL=27-IRQ。引入IRQL的动机似乎是这样的:当CPU运行在低IRQL时,如果来了一个高IRQL对应的中断,那么低的中断的ISR是会被高的ISR抢过去的。就是说低的ISR又被一个更高级的ISR中断了。这样的好处是优先级高的ISR可以更快的得到响应。

另外,在具体实现中,由于操作PICOR APCIIRQL是比较费时的,所以WINDOWS是尽量不去直接操作硬件,而是等到万不得已的时候才改。

LINUX中,似乎没有类似IRQL这样的观念。就我目前看过的书和代码来看,LINUX中的ISR或者是KERNLE最多是操作下CPU上的中断标志位(IF)来开启或者关闭中断。也就是说,要么中断全开,要么全关。似乎不会出现低的ISR被高的ISR中断的情况。

从这一点来看,LINUX在这部分的设计上比WINDOWS简单。



二.相似之处

WINDOWSLINUX似乎都把中断分成了2部分。在LINUX中叫ISR(还是其他?)和BOTTOMHALF。而WINODWS中,DPC(DeferredProcedure Calls)APC(AsynchronousProcedure Calls)就非常类似BOTTOMHALF。二者把中断分成两部分的动机是差不多的。都是为了把ISR搞得越快越好。LINUX中,在ISR里一般关中断,所以时间太长的话,其他中断就得不到响应。WINDOWS中,ISR跑在一个很高的IRQL里面,同样会阻塞其他IRQL比较低的任务。

LINUX中的BOTTOMHALF 又可以分为TASKLETSOFIRQ。二者的主要区别是复杂度和并发性(CONCURRENCY)。下面COPY<UNDERSTANDINGLINUX NETWORK INTERNALS>一书。
Tasklet: Only one instance of each tasklet can run at anytime. Different tasklets can run concurrently on different CPUs.
Softirq: Only one instance of each softirq can run at thesame time on a CPU. However, the same softirq can run on different CPUsconcurrentlyOnly one instance of each softirq can run at the same time on aCPU. However, the same softirq can run on different CPUs concurrently.

WINDOWS中的DPC有点类似TASKLETSOFTIRQ
DPC是系统范围内的,并且运行在DPCIRQL。是一个类似中断上下文的环境(INTERRUPTCONTEXT)。APCDPC的区别是运行在更低级别的APCIRQL。另外,APC是针对每一个线程的。执行在某个线程环境中。主要目的也是把一部分事情放到以后去执行。APC又分为KERNELAPC USERAPCAPC这个观念在LINUX中似乎没有类似的?至少我还没想到。

三.参考文献:
1.
WINDOWSINTERALS 4TH
2.
UNDERSTANDINGLINUX NETWORK INTERNALS, 2005

文中也许有些不对的地方,欢迎大家讨论。
回应
0

使用道具 举报

Rank: 9Rank: 9Rank: 9

声望
336
寄托币
955
注册时间
2006-3-31
精华
11
帖子
469

荣誉版主

沙发
发表于 2010-4-8 06:40:02 |只看该作者
中断什么的最讨厌了。。。


飞起来的时候幸福的感觉就来了!

使用道具 举报

Rank: 6Rank: 6

声望
23
寄托币
2212
注册时间
2009-11-28
精华
0
帖子
217
板凳
发表于 2010-4-8 06:49:04 |只看该作者
那个啥。。。
似乎是可以的...忘记了。ulk里面应该是说可以抢断的吧。

Linux design does not allow process switching while the CPU is executing a kernel control
path associated with an interrupt. However, such kernel control paths may be arbitrarily
nested
: an interrupt handler may be interrupted by another interrupt handler and so on.

使用道具 举报

Rank: 9Rank: 9Rank: 9

声望
336
寄托币
955
注册时间
2006-3-31
精华
11
帖子
469

荣誉版主

地板
发表于 2010-4-8 07:37:50 |只看该作者
ls说的和lz说的貌似不矛盾
如果我没有理解错
ls说的是kernel的interrupt可以被抢断
lz说的是CPU的interrupt不可以被抢断
抢断kernel不一定需要抢断CPU


飞起来的时候幸福的感觉就来了!

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1795

荣誉版主 GRE斩浪之魂 Golden Apple

5
发表于 2010-4-8 10:11:57 |只看该作者
恩。MIKE同学说的有道理。

我觉得是这样:在LINUX ISR里如果没有关闭CPU的中断的话,那么isr有可能被另外一个ISR中断掉。不过这样一来,似乎就没有中断优先级的观念了?还是在PIC硬件里自动做好了?

使用道具 举报

Rank: 6Rank: 6

声望
23
寄托币
2212
注册时间
2009-11-28
精华
0
帖子
217
6
发表于 2010-4-9 09:16:04 |只看该作者
恩。MIKE同学说的有道理。

我觉得是这样:在LINUX ISR里如果没有关闭CPU的中断的话,那么isr有可能被另外一个ISR中断掉。不过这样一来,似乎就没有中断优先级的观念了?还是在PIC硬件里自动做好了?
DriverEntry 发表于 2010-4-8 10:11

呜,优先级似乎是没有的。
呜,剩下的偶一个小本就搞不清楚了。。。也木有时间明白了>.<

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1795

荣誉版主 GRE斩浪之魂 Golden Apple

7
发表于 2010-4-9 09:56:02 |只看该作者
赞小本. 比偶小本时强多了.

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1795

荣誉版主 GRE斩浪之魂 Golden Apple

8
发表于 2010-4-11 00:24:28 |只看该作者
3# mikeandmore

那一段是在ULK里的哪一章? 我今天又看了下UNDERSTANDING LINUX NETWORK INTERNALS. 里面明确说了ISR里关中断. 也许是2本书讲的LINUX 版本不一样? 我看的这本好像是老点.

使用道具 举报

Rank: 6Rank: 6

声望
23
寄托币
2212
注册时间
2009-11-28
精华
0
帖子
217
9
发表于 2010-4-11 02:44:34 |只看该作者
8# DriverEntry understand linux kernel。不是一本书-,-
4.3 Nested Execution of Exception and Interrupt Handlers

这个应该说的是2.4的。。。。。莫非你那个是2.2的@_@
或者你那个应该是说网络相关的那些isr会关掉吧

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1795

荣誉版主 GRE斩浪之魂 Golden Apple

10
发表于 2010-4-11 06:48:26 |只看该作者
我知道是2本书。等我再看看ULK那本

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1795

荣誉版主 GRE斩浪之魂 Golden Apple

11
发表于 2010-4-12 10:43:22 |只看该作者
3楼说的没错. 5楼也没错.
LINUX中断可以NESTED. 但是又没有优先级的观念. 还是在 ULK 4.3 ,有下面一段:

To implement an interrupt model without priority levels. Because each interrupt handler may be deferred by another one, there is no need to establish predefined priorities among hardware devices. This simplifies the kernel code and improves its portability.

PS:我看的ULK 是第三版,MIKE同学看的是第二版? 应该升级下了.

使用道具 举报

Rank: 6Rank: 6

声望
23
寄托币
2212
注册时间
2009-11-28
精华
0
帖子
217
12
发表于 2010-4-12 11:28:59 |只看该作者
11# DriverEntry


呜,的确是,偶很久以前看的。。。

使用道具 举报

RE: WINDOWS与LINUX中的中断处理比较 [修改]
您需要登录后才可以回帖 登录 | 立即注册

问答
Offer
投票
面经
最新
精华
转发
转发该帖子
WINDOWS与LINUX中的中断处理比较
https://bbs.gter.net/thread-1082781-1-1.html
复制链接
发送
报offer 祈福 爆照
回顶部