免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 15382 | 回复: 37

内核定时器与软中断 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-09-06 14:39 |显示全部楼层
ULKv3 上介绍run_timer_softirq 函数执行定时器中断,该函数执行的时候,会禁用本地中断。
The run_timer_softirq( ) function is the deferrable function associated with the TIMER_SOFTIRQ softirq. It essentially performs the following actions:

Stores in the base local variable the address of the tvec_base_t data structure associated with the local CPU.

Acquires the base->lock spin lock and disables local interrupts.


那是否可以这样理解,如果我写的定时器函数在执行期间,本地CPU就不会再被其他事件所中断,软中断也不会产生?

论坛徽章:
0
发表于 2010-09-06 16:24 |显示全部楼层
应该还是会被硬中断打断的,但是不会被软中断打断。

论坛徽章:
0
发表于 2010-09-06 16:37 |显示全部楼层
看代码的确是这样,在遍历timer的时候,会调用spin_lock_irq。等到取得一个timer,在调用它的回调函数之前,才会unlock。或者就是等遍历完以后再unlock。
我想应该是因为中断的处理函数是可以add_timer什么的,所以这里不禁止中断还不行……

论坛徽章:
0
发表于 2010-09-06 17:06 |显示全部楼层
刚刚看了下代码,发现fn(data)时,已经unlock了。
所以,被调用的执行函数在执行期间还是会被软、硬中断打断的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-09-06 17:09 |显示全部楼层
刚刚看了下代码,发现fn(data)时,已经unlock了。
所以,被调用的执行函数在执行期间还是会被软、硬中断打断的。

ShadowStar 兄能否说的明确一些。 你的意思定时器执行的时候,还是会被软中断打断的,对吗

论坛徽章:
0
发表于 2010-09-06 17:22 |显示全部楼层
ShadowStar 兄能否说的明确一些。 你的意思定时器执行的时候,还是会被软中断打断的,对吗
Godbach 发表于 2010-09-06 17:09


从代码上看是这样的。
  1.                         set_running_timer(base, timer);                                            
  2.                         detach_timer(timer, 1);
  3.                         spin_unlock_irq(&base->lock);
  4.                         {
  5.                                 int preempt_count = preempt_count();
  6.                                 fn(data);    <--------执行函数
  7.                                 if (preempt_count != preempt_count()) {
  8.                                         printk(KERN_WARNING "huh, entered %p "
  9.                                                "with preempt_count %08x, exited"
  10.                                                " with %08x?\n",
  11.                                                fn, preempt_count,
  12.                                                preempt_count());
  13.                                         BUG();
  14.                                 }
  15.                         }
  16.                         spin_lock_irq(&base->lock);
复制代码
kernel/timer.c,661行。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-09-06 17:36 |显示全部楼层
代码中看来是这样啊。也就是真正执行 timeout 的函数之前, 调用了spin_unlock_irq(&base->lock),释放了锁啊

论坛徽章:
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
发表于 2010-09-06 17:50 |显示全部楼层
很明显超做表的时候的才关.
执行定义的函数时打开

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2010-09-06 17:56 |显示全部楼层
很明显超做表的时候的才关.
执行定义的函数时打开

smalloc 兄的这句话怎么理解啊

论坛徽章:
0
发表于 2010-09-06 19:18 |显示全部楼层
定时器中断执行的函数不会被本机的其它软中断抢占,可以被硬中断抢占。
只是操作定时器本身结构时会关中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP