免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: new_learner

为什么我的spin_lock_irqsave()没有锁住时钟中断? [复制链接]

论坛徽章:
0
发表于 2009-04-22 23:17 |显示全部楼层

回复 #28 new_learner 的帖子

有个问题,
如果关中断不会嵌套的话,为什么要local_irq_save这种形式的关中断呢?
我一直认为就是因为不知道关中断之前中断是关是开,所以需要保存当前的eflags
然后在local_irq_restore中恢复。
否则如果确定关中断之前中断一定是开的,就都直接cli不就行了?
不知道是不是我理解的不对?

论坛徽章:
0
发表于 2009-04-22 23:31 |显示全部楼层

回复 #1 new_learner 的帖子

楼主在代码里这样试一下:

local_irq_disable();
while(1);

论坛徽章:
0
发表于 2009-04-23 00:25 |显示全部楼层
原帖由 peimichael 于 2009-4-22 23:17 发表
有个问题,
如果关中断不会嵌套的话,为什么要local_irq_save这种形式的关中断呢?
我一直认为就是因为不知道关中断之前中断是关是开,所以需要保存当前的eflags
然后在local_irq_restore中恢复。
否则如果 ...


引入local_irq_save()就是为了减轻程序员负担,让程序员不用去理会当前状态是关中断还是开中断,直接调用这个函数就OK了。

你的理解是正确的。

论坛徽章:
0
发表于 2009-04-23 00:27 |显示全部楼层
原帖由 wxc200 于 2009-4-22 23:31 发表
楼主在代码里这样试一下:

local_irq_disable();
while(1);

中断关闭了,副作用引起了内核抢占失效。
如果这时再while(1)的话,在UP中肯定死循环了 ^_^

论坛徽章:
0
发表于 2009-04-23 11:02 |显示全部楼层
原帖由 new_learner 于 2009-4-23 00:27 发表

中断关闭了,副作用引起了内核抢占失效。
如果这时再while(1)的话,在UP中肯定死循环了 ^_^



哦。
中断禁用,这里就不会有时间中断了。。。所以让它死等
你主贴里没禁的原因,可能是退出后又把中断在别的地方打开了。。。


楼主可以看看这个帖子最后的测试
http://www.linuxforum.net/forum/ ... &o=7&fpart=

我上周末也刚刚测试了  中断  锁   抢占   调度的一些小东西   ;D

论坛徽章:
0
发表于 2009-04-24 17:43 |显示全部楼层
spin_lock只是锁资源,不能禁止中断,当有中断(外部)发生时,CPU会自动禁止中断,但在执行中断程序前需打开中断(在spin_lock之后),这样可以防止丢失以后产生的中断.

spin_lock根本没有禁止中断的可能,外部中断是由硬件产生的,和spin_lock没什么关系

论坛徽章:
0
发表于 2009-04-26 14:09 |显示全部楼层
看不懂代码。。。。。。。。。。

论坛徽章:
0
发表于 2009-04-27 14:56 |显示全部楼层
原帖由 wxc200 于 2009-4-23 11:02 发表



哦。
中断禁用,这里就不会有时间中断了。。。所以让它死等
你主贴里没禁的原因,可能是退出后又把中断在别的地方打开了。。。


楼主可以看看这个帖子最后的测试
http://www.linuxforum.net/forum ...

看了下你的帖子,有一点不太明白,请指教
1)占着 mutex锁,关中断,msleep,
希望kernel 挂掉,但系统运行正常 原因是显式调度,schedule()会打开中断。这个跟抢占没有关系


这里,"schedule()会打开中断"是什么意思?
你是指这段代码吗?,在schedule()中, 我的内核版本是2.6.18

  1.         if (likely(prev != next)) {
  2.                 next->timestamp = now;
  3.                 rq->nr_switches++;
  4.                 rq->curr = next;
  5.                 ++*switch_count;

  6.                 prepare_task_switch(rq, next);
  7.                 prev = context_switch(rq, prev, next);
  8.                 barrier();
  9.                 /*
  10.                  * this_rq must be evaluated again because prev may have moved
  11.                  * CPUs since it called schedule(), thus the 'rq' on its stack
  12.                  * frame will be invalid.
  13.                  */
  14.                 finish_task_switch(this_rq(), prev);
  15.         } else
  16.                 spin_unlock_irq(&rq->lock);
复制代码

我看了下只有在else中会有打开中断的动作,但一般都不会进这个else吧?
我哪里理解错了呢?请指教。。。

论坛徽章:
0
发表于 2009-04-27 14:57 |显示全部楼层
原帖由 szlwin 于 2009-4-24 17:43 发表
spin_lock只是锁资源,不能禁止中断,当有中断(外部)发生时,CPU会自动禁止中断,但在执行中断程序前需打开中断(在spin_lock之后),这样可以防止丢失以后产生的中断.

spin_lock根本没有禁止中断的可能,外部中断是由硬件产生的,和spin_lock没什么关系


是的。

但我用的是spin_lock_irqsave(),不是spin_lock().

论坛徽章:
0
发表于 2009-04-27 16:05 |显示全部楼层
请问楼主你的spin_lock_irqsave(&my_spinlock, flags);究竟锁住的是什么资源呢??CPU??timer??
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP