免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2009-04-22 16:33 |显示全部楼层
原帖由 peimichael 于 2009-4-22 16:29 发表


恩,觉得这个有道理
在我之前有人用了loca_irq_save禁了中断,我又禁用了一次中断,
后来虽然我没有开中断,但是前面那个人开启了中断,
最后中断还是打开的

而“前面那个人”有可能是外层调用local_ ...

1.关中断不会嵌套
不论前面连续关多少次,后面只要开一次就行了。

2.在我实验的例子里,就是这个意思。

论坛徽章:
0
12 [报告]
发表于 2009-04-22 16:50 |显示全部楼层
原帖由 eexplorer 于 2009-4-22 16:46 发表


LZ的学习激情很高啊,觉得自己老了,很懒,学什么都提不起劲了。。。

偶太菜了,啥都不懂,当然要多学学了。。。^_^
有问题请您多指教啊:)

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


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

你的理解是正确的。

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

local_irq_disable();
while(1);

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

论坛徽章:
0
15 [报告]
发表于 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
16 [报告]
发表于 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
17 [报告]
发表于 2009-04-27 16:08 |显示全部楼层
原帖由 liuweni 于 2009-4-27 16:05 发表
请问楼主你的spin_lock_irqsave(&my_spinlock, flags);究竟锁住的是什么资源呢??CPU??timer??

什么资源都没锁,仅仅是把中断禁了。。。。
做个小实验而已。。。

论坛徽章:
0
18 [报告]
发表于 2009-04-27 16:23 |显示全部楼层
原帖由 liuweni 于 2009-4-27 16:20 发表
你写的代码禁用了中断,那么是否有这么一种情况:内核依然会继续执行,只是没有了抢占,在之后的内核执行过程中某一段代码再次将打开中断的。

19楼已经给出了答案

论坛徽章:
0
19 [报告]
发表于 2009-04-27 16:39 |显示全部楼层
原帖由 liuweni 于 2009-4-27 16:33 发表
module加载的过程没研究……

跟module加载过程无关
而是X86中对待exception处理的原因(具体到这里就是0x80异常)

论坛徽章:
0
20 [报告]
发表于 2009-04-29 00:45 |显示全部楼层
原帖由 sam58123 于 2009-4-28 19:17 发表
那么对于多处理器系统,如果我只想让其中一个cpu响应外设中断,该如何屏蔽另一个cpu呢?
我遇到一个问题,在驱动模块中触发中断后,总是两个cpu同时响应这个中断,就等于中断处理函数被执行了两次,而我只需要执行一次就可以了。尝试过在中断处理函数中使用spin_lock_irqsave,但中断就有点乱了,有时候是cpu0执行,有时候是cpu1执行,甚至有时候cpu0执行两次。我的内核是:2.6.27.7-9

X86中,外部中断经过APIC分发以后,应该只有一个cpu会去处理某个中断吧。
可能这个问题还是需要找到root cause:为什么两个cpu会同时响应一个中断?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP