免费注册 查看新帖 |

Chinaunix

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

Linux内核原子操作的一点疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-03 15:06 |只看该作者 |倒序浏览
本帖最后由 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原子变量?
希望大家帮我解答一下,我是初学驱动的。

论坛徽章:
0
2 [报告]
发表于 2011-04-03 16:57 |只看该作者
哦,我自个明白了,xxx_available这个变量是共用的,内核模块自打insmod进系统时,全局变量就被分配了内存空间,所以不管是哪个进程调用这个驱动模块,他们都是使用的同一个xxx_available变量。

如有不对,请斧正,谢谢

论坛徽章:
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
3 [报告]
发表于 2011-04-03 17:46 |只看该作者
      if( !atomic_dev_and_test( &xxx_available)) {
           atomic_inc(&xxx_available);
           return -EBUSY;
      }

应该是
atomic_dec_and_test

论坛徽章:
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
4 [报告]
发表于 2011-04-03 17:48 |只看该作者
回复 1# zsmctfy


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

两个进程,顶多分别调用open,模块只加载一次的话,全局变量是就是共享的,都是操作同一个全局变量,所以要考虑原子性

论坛徽章:
0
5 [报告]
发表于 2011-04-03 17:50 |只看该作者
回复 3# Godbach
是哦,我打错了,我改一下

论坛徽章:
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
6 [报告]
发表于 2011-04-03 17:51 |只看该作者
看我 4 楼的回复

论坛徽章:
0
7 [报告]
发表于 2011-04-03 17:52 |只看该作者
回复 4# Godbach


    嗯,我现在理解了,我是刚发完这个贴就想明白了,再看一下你的解答,我就更清楚了。谢谢你

论坛徽章:
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
8 [报告]
发表于 2011-04-03 17:54 |只看该作者
回复 7# zsmctfy

不用客气
有什么学习心得,也欢迎发帖和大家一起交流

论坛徽章:
0
9 [报告]
发表于 2011-04-03 17:57 |只看该作者
回复 8# Godbach


    嗯,会的,thanks

论坛徽章:
0
10 [报告]
发表于 2011-04-11 13:55 |只看该作者
原子变量 是 内核变量

内核空间是进程A和B共享的,所以内核中只存在一个原子变量
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP