免费注册 查看新帖 |

Chinaunix

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

[中断] 线上讨论之linux中断总结分享 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2011-12-01 21:29 |只看该作者
回复 41# amarant
中断这一块还存在一些疑问,
例如,定时器中断丢失如何做补偿?

以前是用TSC这种time base来做的。引入hrtime后变化比较大,现在no_hz都不完全被动依赖于硬件产生中断来计数,完全由软件主动的来控制是否产生时钟中断了。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
52 [报告]
发表于 2011-12-01 22:11 |只看该作者
回复  amarant

以前是用TSC这种time base来做的。引入hrtime后变化比较大,现在no_hz都不完全被动依赖于 ...
xs3c 发表于 2011-12-01 21:29



    呵呵 在书上也看过相关的说法,一直没去代码里看看是怎么搞的 等周末有空了好好分析下

论坛徽章:
0
53 [报告]
发表于 2011-12-02 11:39 |只看该作者
曾经研究过一阵子,还有几个问题没搞明白

论坛徽章:
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
54 [报告]
发表于 2011-12-02 13:57 |只看该作者
回复 53# q631951221
期待把研究的结果分析一下哦

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
55 [报告]
发表于 2011-12-02 14:56 |只看该作者
有个简单问题:

ULK3上说"与HI_SOFTIRQ软中断相关的软中断函数叫tasklet_hi_action(),而与TASKLET_SOFTIRQ相关的函数叫做tasklet_action()。"


软中断是用open_softirq()注册处理程序的,那tasklet_action(),tasklet_hi_action()在什么时候注册的呢,我怎么没找到?

论坛徽章:
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
56 [报告]
发表于 2011-12-02 15:37 |只看该作者
回复 55# embeddedlwp
ULK3上说"与HI_SOFTIRQ软中断相关的软中断函数叫tasklet_hi_action(),而与TASKLET_SOFTIRQ相关的函数叫做tasklet_action()。"


软中断是用open_softirq()注册处理程序的,那tasklet_action(),tasklet_hi_action()在什么时候注册的呢,我怎么没找到?

你是什么版本的内核啊?怎么会找不到呢?kernel/softirq.c
  1. void __init softirq_init(void)
  2. {
  3.         int cpu;

  4.         for_each_possible_cpu(cpu) {
  5.                 int i;

  6.                 per_cpu(tasklet_vec, cpu).tail =
  7.                         &per_cpu(tasklet_vec, cpu).head;
  8.                 per_cpu(tasklet_hi_vec, cpu).tail =
  9.                         &per_cpu(tasklet_hi_vec, cpu).head;
  10.                 for (i = 0; i < NR_SOFTIRQS; i++)
  11.                         INIT_LIST_HEAD(&per_cpu(softirq_work_list[i], cpu));
  12.         }

  13.         register_hotcpu_notifier(&remote_softirq_cpu_notifier);

  14.         open_softirq(TASKLET_SOFTIRQ, tasklet_action);
  15.         open_softirq(HI_SOFTIRQ, tasklet_hi_action);
  16. }
复制代码

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
57 [报告]
发表于 2011-12-02 15:40 |只看该作者
本帖最后由 embeddedlwp 于 2011-12-02 16:02 编辑

回复 56# 瀚海书香


    谢谢版主大人! 建议版主大人再搞个“内核同步”贴! 无论搞驱动,内核都很重要,而且面试必问!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
58 [报告]
发表于 2011-12-02 15:55 |只看该作者
本帖最后由 embeddedlwp 于 2011-12-02 15:56 编辑

同类软中断是可以并发的运行在多个CPU上的。
比如一个 NET_TX_SOFTIRQ已经被raise_softirq,那么另一个NET_TX_SOFTIRQ怎样被激活呢?
  1. #define __raise_softirq_irqoff(nr) do{local_softirq_pending() |= 1UL << (nr); }while(0)
复制代码
如果调用raise_softirq,最终会调用__raise_softirq_irqoff,没看出怎样产生第二个同类的软中断,也就是说,激活第一个 NET_TX_SOFTIRQ的时候就置位了,如果第一个 NET_TX_SOFTIRQ还没运行,标志位应该还在,再置一次也没啥意义。

在__do_softirq函数中对__softirq_pending进行了清零。难道只能在清零之后产生第二个同类的软中断,并在不懂的CPU上运行?

求指点!

论坛徽章:
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
59 [报告]
发表于 2011-12-02 16:56 |只看该作者
回复 58# embeddedlwp
在__do_softirq函数中对__softirq_pending进行了清零。难道只能在清零之后产生第二个同类的软中断,并在不懂的CPU上运行?

软中断的执行是循环执行的,也就说如果再执行的过程中,又有新的软中断产生,那么就会循环执行的。当然了,循环次数是有限制的。如果到了一定次数后,还有新的软中断等待处理,那么就会激活ksoftirqd线程来处理未处理的软中断。

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
60 [报告]
发表于 2011-12-02 18:40 |只看该作者

  1. 25 /*
  2. 26  * These correspond to the IORESOURCE_IRQ_* defines in
  3. 27  * linux/ioport.h to select the interrupt line behaviour.  When
  4. 28  * requesting an interrupt without specifying a IRQF_TRIGGER, the
  5. 29  * setting should be assumed to be "as already configured", which
  6. 30  * may be as per machine or firmware initialisation.
  7. 31  */
  8. 32 #define IRQF_TRIGGER_NONE   0x00000000
  9. 33 #define IRQF_TRIGGER_RISING 0x00000001
  10. 34 #define IRQF_TRIGGER_FALLING    0x00000002
  11. 35 #define IRQF_TRIGGER_HIGH   0x00000004
  12. 36 #define IRQF_TRIGGER_LOW    0x00000008
  13. 37 #define IRQF_TRIGGER_MASK   (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
  14. 38                  IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
  15. 39 #define IRQF_TRIGGER_PROBE  0x00000010
  16. 40
  17. 41 /*
  18. 42  * These flags used only by the kernel as part of the
  19. 43  * irq handling routines.
  20. 44  *
  21. 45  * IRQF_DISABLED - keep irqs disabled when calling the action handler.
  22. 46  *                 DEPRECATED. This flag is a NOOP and scheduled to be removed
  23. 47  * IRQF_SAMPLE_RANDOM - irq is used to feed the random generator
  24. 48  * IRQF_SHARED - allow sharing the irq among several devices
  25. 49  * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
  26. 50  * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
  27. 51  * IRQF_PERCPU - Interrupt is per cpu
  28. 52  * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
  29. 53  * IRQF_IRQPOLL - Interrupt is used for polling (only the interrupt that is
  30. 54  *                registered first in an shared interrupt is considered for
  31. 55  *                performance reasons)
  32. 56  * IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished.
  33. 57  *                Used by threaded interrupts which need to keep the
  34. 58  *                irq line disabled until the threaded handler has been run.
  35. 59  * IRQF_NO_SUSPEND - Do not disable this IRQ during suspend
  36. 60  * IRQF_FORCE_RESUME - Force enable it on resume even if IRQF_NO_SUSPEND is set
  37. 61  * IRQF_NO_THREAD - Interrupt cannot be threaded
  38. 62  * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
  39. 63  *                resume time.
  40. 64  */

复制代码
中断是不是就是上面这些类型呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP