Chinaunix首页 | 论坛 | 博客
  • 博客访问: 99149
  • 博文数量: 24
  • 博客积分: 407
  • 博客等级: 一等列兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-02 08:31
文章分类
文章存档

2012年(24)

我的朋友

分类: LINUX

2012-02-23 10:11:23

按照常理,前面谈了驱动的一些基本概念,今天应该写些关于模块编程的东西。昨天在贴吧跟人讨论了下linux中的中断,自己在私下里进行了反思,有点小认识,希望先跟大家分享下,以我的记忆,过两天估计就忘了,呵呵。如果是刚接触linux设备驱动,可先跳过。
 
在这里还是只谈理论,不涉及程序算法,有兴趣的可以看ldd,宋宝华等书。关于中断,我看网上也没有统一的认识,以下观点很多是自己的,如有错误,请回复指出,感激不尽。
 
我们知道,在计算机系统中,cpu要与外界设备进行交互,是靠两种基本方式来进行:中断和轮询。中断是指外界设备在有事件发生的情况下,发送硬件信号给CPU,cpu检测到这个硬件信号以后,停止当前手头上的工作(比如正在运行某个进程),转去处理这个硬件信号。有个经典的例子,就是边烧开水,忽然有人敲门,呵呵,我们总是先开门再继续等。其实中断可以理解为一种硬件机制,而linux为了很好的利用这种机制,便设计了一套最优(权衡了很多方面)策略来配合硬件,这就组成了所谓的linux中断系统。
 
下面重点区分几个概念。
1,硬件中断:其实就是我们所认为的中断,从接触微机原理,51时,所认识的中断。
   软件中断和软中断(请允许我这么称呼,因为很多论坛都是这样的),这是两个完全不相干的概念。软件中断是计算机本身的一种异常(在arm中是这样的),在arm中,SWI指令引起swi异常,处理器切换到管理模式。在linux中,当程序执行系统调用时,便是执行了这条指令,然后陷入内核态,这便是所谓的进程上下文。当然在x86中也有相应的机制,我以前看过现在记不清了,好像是什么int 80之类,大家就当没说。
 
   软中断,在ldd中就提的比较多了,它是中断延迟执行的一种方法,即实现中断下半部的一种方法,tasklet是基于软中断实现的,(另一种是工作队列)。具体的到介绍中断系统是详细说。
 
2 快速中断,慢速中断,上下半部一起讲,之所以这样,是因为最初学习时感觉ldd中对它们的介绍似乎有点矛盾,请大家一起分析。
 
首先快速和慢速中断是否对应arm中的fiq和irq呢?这是我看到这个概念是最先想到的问题。答案是否定的。没有任何的联系。linux压根没有处理fiq。
 
ldd中这样写道:当慢速中断正在执行时,慢速中断要求处理器可以再次启用中断。在现在内核中,区别已不大,只剩一个:快速中断执行时,当前处理器其他所有中断都被禁止。先讲到这里。
 
ldd中关于顶半部和底半部是这样描述的:它们最大的不同是:底半部执行时,所有中断时打开的,也就是说顶半部(request_irq注册中断例程)执行时,关闭所有中断,不可打断。
 
以上,还好理解。我还有一个问题,那快速中断和慢速中断的划分依据是顶半部还是底半部,或者是中断处理的整个过程(包括底半部和顶半部)??很多地方在逃避这个问题,可以好好思考下里面的逻辑。首先慢速中断时,中断可以启用,但是上半部是不容打断的,呵呵,有点乱。
 
还是直接说说自己想法(紧供参考):快慢中断的区分是针对整个中断处理过程的(包括上下半部),而且可以保证,不论快速慢速中断,它们的上半部都是不可中断的,都是原子的。在很久很久以前,快速中断的下半部也是不可中断的,这样执行会快点。但随着硬件水平的提高,速度差别以不大,中断处理程序基本都是慢中断了,他们的下半部是可以中断的。
 
还得说一个问题:如果一个设备中断处理正在进行,不管是上半部还是下半部,只要没处理完,这一期间同一设备(很关键)产生的中断都是被忽略的,即中断时不可重入的。(和上面说的并不矛盾,不可重入可理解为同一中断处理程序不能并行)。
 
太乱了,到此为止吧,欢迎讨论。(以上顶半部和上半部是指的同一概念,写的过程中没注意,呵呵)。
 
 
 
阅读(6648) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~