免费注册 查看新帖 |

Chinaunix

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

浅析Linux的软中断的实现 [复制链接]

论坛徽章:
2
申猴
日期:2013-12-26 22:11:31天秤座
日期:2014-12-23 10:23:19
11 [报告]
发表于 2011-06-17 12:31 |只看该作者
哦,才发现情景分析上软中断讲的也很好

论坛徽章:
0
12 [报告]
发表于 2011-06-17 13:03 |只看该作者
回复 10# 独孤九贱


    上半部和下半部都是驱动程序实现的吧?

论坛徽章:
0
13 [报告]
发表于 2011-06-17 17:21 |只看该作者
回复  独孤九贱


    上半部和下半部都是驱动程序实现的吧?
20040925 发表于 2011-06-17 13:03


不一定。
如果你的下半部处理是标准的,例如网卡,则内核已经实现了。如果不是,则需要你自己实现。这只是一种思路,其实你没有下半部也无怕谓(即将它合并到驱动中),嘿嘿!!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
14 [报告]
发表于 2011-06-18 15:02 |只看该作者
本帖最后由 瀚海书香 于 2011-06-18 15:04 编辑

回复 1# 独孤九贱
调度时机好像还有ksoftirqd内核线程。ksoftirqd的执行代码如下
  1. static int ksoftirqd(void * __bind_cpu)
  2. {
  3.         set_current_state(TASK_INTERRUPTIBLE);

  4.         while (!kthread_should_stop()) {
  5.                 preempt_disable();
  6.                 if (!local_softirq_pending()) {
  7.                         preempt_enable_no_resched();
  8.                         schedule();
  9.                         preempt_disable();
  10.                 }

  11.                 __set_current_state(TASK_RUNNING);

  12.                 while (local_softirq_pending()) {
  13.                         /* Preempt disable stops cpu going offline.
  14.                            If already offline, we'll be on wrong CPU:
  15.                            don't process */
  16.                         if (cpu_is_offline((long)__bind_cpu))
  17.                                 goto wait_to_die;
  18.                         do_softirq();
  19.                         preempt_enable_no_resched();
  20.                         cond_resched();
  21.                         preempt_disable();
  22.                 }
  23.                 preempt_enable();
  24.                 set_current_state(TASK_INTERRUPTIBLE);
  25.         }
  26.         __set_current_state(TASK_RUNNING);
  27.         return 0;

  28. wait_to_die:
  29.         preempt_enable();
  30.         /* Wait for kthread_stop */
  31.         set_current_state(TASK_INTERRUPTIBLE);
  32.         while (!kthread_should_stop()) {
  33.                 schedule();
  34.                 set_current_state(TASK_INTERRUPTIBLE);
  35.         }
  36.         __set_current_state(TASK_RUNNING);
  37.         return 0;
  38. }
复制代码

论坛徽章:
0
15 [报告]
发表于 2011-06-18 22:30 |只看该作者
回复  独孤九贱
调度时机好像还有ksoftirqd内核线程。ksoftirqd的执行代码如下
瀚海书香 发表于 2011-06-18 15:02


哈哈,是的,ksoftirqd是方式之一,不过你没有仔细看我的贴子,原文是“是的,除了raise_softirq在,可能会(嗯,重要的是“可能”)通过wakeup_softirqd唤醒ksoftirqd外,还得明白软中断的其它调用时机。”

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
16 [报告]
发表于 2011-06-18 22:48 |只看该作者
回复 11# goter


    为什么是才发现?

论坛徽章:
2
申猴
日期:2013-12-26 22:11:31天秤座
日期:2014-12-23 10:23:19
17 [报告]
发表于 2011-07-03 22:56 |只看该作者
回复 16# smalloc


    因为之前没大看懂,哈哈

论坛徽章:
0
18 [报告]
发表于 2011-09-09 10:07 |只看该作者
1.2 激活

当需要调用软中断时,需要调用raise_softirq函数激活软中断,这里使用术语“激活”而非“调用”,
是因为在很多情况下不能直接调用软中断。所以只能快速地将其标志为“可执行”,等待未来某一时刻调用。


菜鸟请教一个问题。
上面一段话中
所以只能快速地将其标志为“可执行”,等待未来某一时刻调用
等待未来某一时刻,后文中分析了4种情况,如果这个时刻还是因为其它的某些原因迟迟不来的话,这样在网络中实时性岂不是很差,求解释
迟迟不来可以认为是很少发生的情况,但是如果是不可预知的,也很恐怖啊

论坛徽章:
0
19 [报告]
发表于 2011-09-11 00:22 |只看该作者
赞,好文!

论坛徽章:
0
20 [报告]
发表于 2011-10-12 13:49 |只看该作者
谢谢了,看了你的文章思路清晰多了 呵呵,在研究一下代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP