免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ocean390
打印 上一主题 下一主题

软中断是如何实现的? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-05-03 23:07 |只看该作者
这是freebsd优先权问题没检查自己是否为胡说八道,大家只做为一参考吧)
*
* 优先权范围从 0 到 255,两线程优先权在值小于4的时候没什么影响
*
* 中断线程:                0 - 63
* 顶半核心线程:        64 - 127
* 实时用户区线程:        128 - 159
* 分时的用户区线程序:        160 - 223
* 空闲的线程:                224 - 255
*
* 还未实现的:如果中断和顶半部线程的范围合并??? 那就使用户区进程能有更大范围
*/

#define        PRI_MIN                        (0)                /* 最高优先权. */
#define        PRI_MAX                        (255)                /* 最低优先权. */

#define        PRI_MIN_ITHD                (PRI_MIN) /*这是中断线程优先权开始值*/
#define        PRI_MAX_ITHD                (PRI_MIN_KERN - 1)/*这是中断线程优先权结束值(PRI_MIN_KERN是64)*/

#define        PI_REALTIME                (PRI_MIN_ITHD + 0)/*实时中断优先权最高*/
#define        PI_AV                        (PRI_MIN_ITHD + 4)/*音频,视频中断排第二位(干嘛叫AV???)*/
#define        PI_TTYHIGH                (PRI_MIN_ITHD + /*高优先权的控制台线程*/
#define        PI_TAPE                        (PRI_MIN_ITHD + 12)/*ATAPI中断*/
#define        PI_NET                        (PRI_MIN_ITHD + 16)/*网络中断*/
#define        PI_DISK                        (PRI_MIN_ITHD + 20)/*磁盘中断*/
#define        PI_TTYLOW                (PRI_MIN_ITHD + 24)/*低优先权的控制台线程*/
#define        PI_DISKLOW                (PRI_MIN_ITHD + 2/*低速度磁盘中断*/
#define        PI_DULL                        (PRI_MIN_ITHD + 32)/*什么东西*/
#define        PI_SOFT                        (PRI_MIN_ITHD + 36)/*软件中断.如POLLING,IP软中断,由swi_add函数使用*/

#define        PRI_MIN_KERN                (64)
#define        PRI_MAX_KERN                (PRI_MIN_REALTIME - 1)

#define        PSWP                        (PRI_MIN_KERN + 0)  /*内存交换进程使用*/
#define        PVM                        (PRI_MIN_KERN + 4)      /*内存页的换入换出*/
#define        PINOD                        (PRI_MIN_KERN +   /*文件系统使用*/
#define        PRIBIO                        (PRI_MIN_KERN + 12) /*磁盘等存储使用*/
#define        PVFS                        (PRI_MIN_KERN + 16) /*虚拟文件系统*/
#define        PZERO                        (PRI_MIN_KERN + 20) /*使用的此优先权的进程(或设备)太多,说不清.可能比较中性的*/
#define        PSOCK                        (PRI_MIN_KERN + 24) /*使用套接字的一些进程,NFS,RPC等等*/
#define        PWAIT                        (PRI_MIN_KERN + 2 /*真不知道了*/
#define        PCONFIG                        (PRI_MIN_KERN + 32) /*AUTOCONF使用的*/
#define        PLOCK                        (PRI_MIN_KERN + 36) /*文件锁使用*/
#define        PPAUSE                        (PRI_MIN_KERN + 40)

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
22 [报告]
发表于 2006-05-03 23:20 |只看该作者
continuration-passing 看起来很难的样子
http://www.blogjava.net/canonical/archive/2005/12/12/23406.html
http://tech.ccidnet.com/art/1077/20050722/292705_1.html

另外,请教一下老大kc是什么的缩写?

[ 本帖最后由 gvim 于 2006-5-3 23:28 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2006-05-03 23:31 |只看该作者
/* 这是他说的
* kcont -- Continuation-passing for BSD kernels.
*
* This module defines structures that implement a
* continuation-passing model in C which can be used as a
* ``callback''-like alternative to using a process context to
* tsleep() on an object address, waiting for some event or status
* change on that object.  Since ANSI C provides neither
* lexically-nested functions nor heap allocation of activation
* records, we implement a continuation as a struct containing:
* 1. A function pointer, pointing to the continuation.
* 2. A object pointer: the object being "slept" upon.
* 3. An argument pointer: a pointer to private storage containing
*    other arguments to the continuation function, including any
*    additional state beyond the "slept-upon" object.
*/

论坛徽章:
0
24 [报告]
发表于 2006-05-03 23:34 |只看该作者
没有中断线程前,中断当然是在当前的进程或者线程中处理的。这个我也清楚。
我想问的是在没有中断线程前,是如何处理软件中断的。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
25 [报告]
发表于 2006-05-03 23:35 |只看该作者
k(ern)c(ontinuation)?这个缩写也缩的有点多哦
恩,看了看Continuation,确实对我来说比较新鲜。多谢老大指点

论坛徽章:
0
26 [报告]
发表于 2006-05-04 00:20 |只看该作者
原帖由 ocean390 于 2006-5-3 23:34 发表
没有中断线程前,中断当然是在当前的进程或者线程中处理的。这个我也清楚。
我想问的是在没有中断线程前,是如何处理软件中断的。

嗯,在中断线程的守护线程建立前,首先用户区是不会发出软件中断的.
而且守护线程在系统初始化时就建立(使用SYSINIT,比如NET的建立过程)
SYSINIT(start_netisr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_netisr, NULL)
就通过SYSINIT建立swi_net守护线程.
整个过程是:
SYSINIT->start_netisr->调用swi_add加入net_net到核心中断线程队列->
swi_add | ->ithread_create建立->kthread_create一守护线程ithread_loop
            | ->ithread_add_handler加入建立后的线程到中断线程队列.
代码涉及的文件到是不多,但涵盖了软件中断和硬件中断的一些原理.

[ 本帖最后由 xie_minix 于 2006-5-4 00:21 编辑 ]

论坛徽章:
0
27 [报告]
发表于 2006-05-04 01:28 |只看该作者
我想问一下在FreeBSD以前的没有使用中断线程这个方法的版本中,是如何处理软件中断的。我的理解软件中断就是把中断处理中不太紧急的进行延期处理,不知道对不对?

论坛徽章:
0
28 [报告]
发表于 2006-05-04 09:30 |只看该作者
首先,我没看过这种版本.也许是很老的版本.
估计虽然没有轻量级线程,但从进程的角度
来看,应该是一样的.软件中断本身就是下一
轮执行(还要看优先权排第几),我从没考虑过
用户区的陷入(比如int 80)的情况,主要是从
核心内的软中断调用实现来考虑,不知道我讲
清楚了没有.
比如在网络驱动程序(通用部分)处理包的情况
也是如此,比如接收到ARP包,在schednetisr
函数设置运行队列后,整个驱动程序运行结束
调度程序接管,进行调度作业.

论坛徽章:
0
29 [报告]
发表于 2006-05-04 13:48 |只看该作者
看一下中断返回的代码就比较清楚了。

  1. 281 doreti_ast:
  2. 282         /*
  3. 283          * Check for ASTs atomically with returning.  Disabling CPU
  4. 284          * interrupts provides sufficient locking even in the SMP case,
  5. 285          * since we will be informed of any new ASTs by an IPI.
  6. 286          */
  7. 287         cli
  8. 288         movl    PCPU(CURTHREAD),%eax
  9. 289         testl   $TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%eax)
  10. 290         je      doreti_exit
  11. 291         sti
  12. 292         pushl   %esp                    /* pass a pointer to the trapframe */
  13. 293         call    ast
  14. 294         add     $4,%esp
  15. 295         jmp     doreti_ast
复制代码

其实就是异常/中断返回的时候检查一下标志位。

论坛徽章:
0
30 [报告]
发表于 2006-05-04 15:40 |只看该作者
软中断是一种推后执行的机制,定时器,网卡的数据的处理是很典型的软中断,这个和中断向量表里的中断是完全不一样的,以网络数据的处理为例,当网卡接到一个数据包后,其中断处理程序只是把数据复制到缓冲区,然后就告诉网卡,你可以再传数据给我了,也就是中断返回,但在此之前,网卡的中断处理程序要置一个标志位,告诉操作系统有事要做,这个事就是软中断,但软中断只是很多中断返回时要做的事情之一,操作系统每次中断返回时会检查着个标志位,看是否有事要做,如果有,就会去处理,象前面提到的网卡,这时候操作系统就回调用软中断的处理函数,网卡的软中断程序就是做分析数据包啊,这个数据应该传给谁啊等这些工作.没有,就返回了,除了必须的部分,中断处理程序都是在开中断的情况下运行的.linux-2.6.12的kernel/目录下有一个文件叫softirq.c就是软中断的实现,里面有个函数叫do_softirq();他好象是在do_IRQ中被调用的(在irq_exit()中),netbsd的现在还没看懂,所以说不好

[ 本帖最后由 zhuzj 于 2006-5-4 15:47 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP