Chinaunix

标题: Linux内核原子操作的一点疑问 [打印本页]

作者: zsmctfy    时间: 2011-04-03 15:06
标题: Linux内核原子操作的一点疑问
本帖最后由 zsmctfy 于 2011-04-03 17:50 编辑

有这样一段原子操作的代码:(是《Linux设备驱动详解》书上的)
static atomoic xxx_available = ATOMIC_INIT(1);

static int xxx_open (struct inode * inode, struct file * file)
{
      ....
      if( !atomic_dec_and_test( &xxx_available)) {
           atomic_inc(&xxx_available);
           return -EBUSY;
      }
      .....
      return 0;
}

static int xxx_release(struct inode *inode, struct file *filp)
{
      atomic_inc( & xxx_available);
      return 0;
}


这里我有点疑问。如果两个进程A和B,它们都调用了这个驱动模块,那么会不会定义两个xxx_available原子变量。如果会,也就是两个进程在使用各自的xxx_available原子变量,那就没有起到互斥的作用,两个进程同时访问同一个设备就会出现故障;如果不会,那xxx_available是定义的static变量,静态的变量,它只能被本文件里的程序代码访问。好像我表达得不是蛮清楚啊!反正就是想问各个进程用的是不是同一个xxx_available原子变量?
希望大家帮我解答一下,我是初学驱动的。
作者: zsmctfy    时间: 2011-04-03 16:57
哦,我自个明白了,xxx_available这个变量是共用的,内核模块自打insmod进系统时,全局变量就被分配了内存空间,所以不管是哪个进程调用这个驱动模块,他们都是使用的同一个xxx_available变量。

如有不对,请斧正,谢谢
作者: Godbach    时间: 2011-04-03 17:46
      if( !atomic_dev_and_test( &xxx_available)) {
           atomic_inc(&xxx_available);
           return -EBUSY;
      }

应该是
atomic_dec_and_test


作者: Godbach    时间: 2011-04-03 17:48
回复 1# zsmctfy


   
这里我有点疑问。如果两个进程A和B,它们都调用了这个驱动模块,那么会不会定义两个xxx_available原子变量。

两个进程,顶多分别调用open,模块只加载一次的话,全局变量是就是共享的,都是操作同一个全局变量,所以要考虑原子性
作者: zsmctfy    时间: 2011-04-03 17:50
回复 3# Godbach
是哦,我打错了,我改一下
作者: Godbach    时间: 2011-04-03 17:51
看我 4 楼的回复
作者: zsmctfy    时间: 2011-04-03 17:52
回复 4# Godbach


    嗯,我现在理解了,我是刚发完这个贴就想明白了,再看一下你的解答,我就更清楚了。谢谢你
作者: Godbach    时间: 2011-04-03 17:54
回复 7# zsmctfy

不用客气
有什么学习心得,也欢迎发帖和大家一起交流
作者: zsmctfy    时间: 2011-04-03 17:57
回复 8# Godbach


    嗯,会的,thanks
作者: menubada    时间: 2011-04-11 13:55
原子变量 是 内核变量

内核空间是进程A和B共享的,所以内核中只存在一个原子变量
作者: zsmctfy    时间: 2011-04-11 15:33
回复 10# menubada


    嗯,现在明白了,谢谢!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2