Chinaunix首页 | 论坛 | 博客
  • 博客访问: 460475
  • 博文数量: 285
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 629
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-14 17:53
个人简介

相信自己,快乐每一天

文章分类

全部博文(285)

分类: LINUX

2013-10-23 14:02:18

正在学习驱动开发,这里只是把自己当时读书的感受写下来,由于是刚刚学习,不对之处还希望大家多多指点和补充信息,如具体的事例等等,非常谢谢。

原子操作指的是在执过程中不会被别的代码路径所中断的操作。 
Linux 内核提供了一系列函数来实现内核中的原子操作,这些函数又分为两类,分别针对位和整型变量进行原子操作。它们的共同点是在任何情况下操作都是原子的,内核代码可以安全地调用它们而不被打断。位和整型变量原子操作都依赖底层 CPU 的原子操作来实现,因此所有这些函数都与 CPU 架构密切相关。

整型原子操作

1.设置原子变量的值 
void atomic_set(atomic_t *v, int i); /* 设置原子变量的值为 i */ 
atomic_t v = ATOMIC_INIT(0); /* 定义原子变量 v 并初始化为 0 */ 
2.获取原子变量的值 
atomic_read(atomic_t *v);  /* 返回原子变量的值*/ 
3.原子变量加/减 
void atomic_add(int i, atomic_t *v); /* 原子变量增加 i */ 
void atomic_sub(int i, atomic_t *v); /* 原子变量减少 i */ 
4.原子变量自增/自减 
void atomic_inc(atomic_t *v);    /* 原子变量增加 1 */ 
void atomic_dec(atomic_t *v);    /* 原子变量减少 1 */ 
5.操作并测试
int atomic_inc
int atomic_dec_and_test(atomic_t *v); 
int atomic_sub_and_test(int i, atomic_t *v); 
上述操作对原子变量执行自增、自减和减操作后(注意没有加)测试其是否为 0,为 0 返回
,否则返回 false。 
6.操作并返回 
int atomic_add_return(int i, atomic_t *v); 
int atomic_sub_return(int i, atomic_t *v); 
int atomic_inc_return(atomic_t *v); 
int atomic_dec_return(atomic_t *v); 
上述操作对原子变量进行加/减和自增/自减操作,并返回新的值。 

位原子操作



1.设置位 
void set_bit(nr, void *addr); 
上述操作设置 addr 地址的第 nr 位,所谓设置位即是将位写为 1。
2.清除位 
void clear_bit(nr, void *addr); 
上述操作清除 addr 地址的第 nr 位,所谓清除位即是将位写为 0。
3.改变位 
void change_bit(nr, void *addr); 
上述操作对 addr 地址的第 nr 位进行反置。 
4.测试位 
test_bit(nr, void *addr); 
上述操作返回 addr 地址的第 nr 位。 
5.测试并操作位 
int test_and_set_bit(nr, void *addr); 
int test_and_clear_bit(nr, void *addr); 
int test_and_change_bit(nr, void *addr); 
上述 test_and_xxx_bit(nr, void *addr)操作等同于执行 test_bit(nr, void *addr)后再执行xxx_bit(nr, void *addr)。
代码清单 7.1(原书中标号)  使用原子变量实现设备只能被一个进程打开
1  static atomic_t xxx_available = ATOMIC_INIT(1); /*定义原子变量*/ 
2       
3  static int xxx_open(struct inode *inode, struct file *filp) 
4  { 
5     ... 
6     if (!atomic_dec_and_test(&xxx_available))  { 
7         atomic_inc(&xxx_available); 
8         return  - EBUSY; /*已经打开*/ 
9     } 
10    ...   
11    return 0; /* 成功 */
12 } 
13  
14 static int xxx_release(struct inode *inode, struct file *filp) 
15 { 
16    atomic_inc(&xxx_available); /* 释放设备 */ 
17    return 0; 
18 } 

阅读(367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~