免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 27160 | 回复: 53
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-20 00:56 |只看该作者 |倒序浏览
尝试用spin_lock_irqsave(),发现没有禁掉时钟中断,不知道我哪里理解错了?
kernel版本:

  1. uname -a 结果:

  2. Linux localhost.localdomain 2.6.18 #1 Sat Jul 19 13:06:00 EDT 2008 i686 i686 i386 GNU/Linux
复制代码


我的代码:

  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/module.h>
  4. #include <linux/spinlock.h>

  5. static spinlock_t my_spinlock;

  6. static int __init init_test()
  7. {
  8.         unsigned long flags;

  9.         spin_lock_init(&my_spinlock);

  10.         spin_lock_irqsave(&my_spinlock, flags);
  11.         return 0;
  12. }

  13. static void __exit init_exit()
  14. {
  15.         return;
  16. }

  17. module_init(init_test);
  18. module_exit(init_exit);
复制代码


加载module以后,通过这样的命令查看墙上时钟:

  1. #date; sleep 2; date

  2. 输出结果:
  3. Sun Apr 19 12:59:42 EDT 2009
  4. Sun Apr 19 12:59:44 EDT 2009
复制代码

墙上时钟仍然在变化,说明时钟中断没有被禁掉。
但我理解的spin_lock_irqsave()会通过cli关掉所有IRQ,并且我在module中也没有spin_unlock_irqrestore(),所以按理说在加载了这个module之后,系统就不会响应任何外部可屏蔽中断了。但实际结果却不是这样。

我哪里理解错了呢?请各位指点,多谢!

[ 本帖最后由 new_learner 于 2009-4-20 01:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-20 10:20 |只看该作者
也许date是查询CMOS中的时间。你无法确定它是通过jeffies来判断时间的

论坛徽章:
0
3 [报告]
发表于 2009-04-20 10:54 |只看该作者
我确认jiffies是被修改过了。
我再写了一个module,在insmod和rmmod的时候打印出jiffies的值,确实被修改过。
那就说明中断没有被禁止掉。

论坛徽章:
0
4 [报告]
发表于 2009-04-20 13:34 |只看该作者

回复 #3 new_learner 的帖子

SMP的kernel?

论坛徽章:
0
5 [报告]
发表于 2009-04-20 13:50 |只看该作者
原帖由 eexplorer 于 2009-4-20 13:34 发表
SMP的kernel?

  1. uname -a 结果:

  2. Linux localhost.localdomain 2.6.18 #1 Sat Jul 19 13:06:00 EDT 2008 i686 i686 i386 GNU/Linux
复制代码


装的vmware虚拟机,不是SMP。

论坛徽章:
0
6 [报告]
发表于 2009-04-20 15:27 |只看该作者
dmesg里一点错误提示都没有吗?

论坛徽章:
0
7 [报告]
发表于 2009-04-20 16:04 |只看该作者
原帖由 richardhesidu 于 2009-4-20 15:27 发表
dmesg里一点错误提示都没有吗?

在insmod my_spin_lock.ko 时,dmesg有这样一句:
my_spin_lock: module license 'unspecified' taints kernel.

因为我代码里没有加入MODULE_LICENSE("GPL");
加入以后再编译insmod,
还是没有禁掉时钟中断

论坛徽章:
0
8 [报告]
发表于 2009-04-21 09:54 |只看该作者
2楼的是对的.PC上的系统时间是放在RTC中的.ULK上讲到了.
但是没关中断就不知道什么问题,而且还引入了虚拟机,估计还要看看虚拟化了.
如果中断关掉了应该你的键盘都不能输入才对.
<系统虚拟化-原理与实现>不错,可以上是虚拟化中的<LKD>

论坛徽章:
0
9 [报告]
发表于 2009-04-21 11:02 |只看该作者
原帖由 new_learner 于 2009-4-20 13:50 发表


uname -a 结果:

Linux localhost.localdomain 2.6.18 #1 Sat Jul 19 13:06:00 EDT 2008 i686 i686 i386 GNU/Linux


装的vmware虚拟机,不是SMP。


没用过虚拟机,也没有UP的机子。可以在UP的物理机子上试一下。。。

论坛徽章:
0
10 [报告]
发表于 2009-04-21 16:16 |只看该作者
我也试过了,cli,local_irq_save
都不行,而且是在真实机上,会不会是因为在进程上下文的原因?
对中断不了解...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP