11.23 原子操作

为了编译android src, 把gcc 版本版本降到4.3 后来学习内核模块 原子操作,写了一个测试模块,可以顺利make,有个warning:mcount  undefined....接着又测试下之前写好的模块,也出现了相同的错误..在网上找了好久,没有发现此问题的解决办法,仔细回忆机器环境的变化就是gcc 版本出错了,改回去,立马编译ok

一 gcc 版本切换 

 1)/usr/bin/gcc 更改软连接

 2)使用工具update-alternatives

    增加两个选项(最后一个值优先级,用于自动模式选择)

     sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 40

     sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40

    sudo update-alternatives --config gcc  输入序号选择.

二 内核原子操作

  原子操作就是在执行过程中不能被中断的操作,即一般时一系列操作,要么全做要么不做.

  在并发处理过程中 ,常规看到的操作例如 int i=2; i+=3;这种简单的赋值语句,看似原子操作,其实质并非原子操作,他们都是又多条汇编代码完成..可以使用objdump -d 查看.

原子操作基本有三种类型: 整型原子操作,64位整型原子操作,位原子操作

 整型原子操作定义在<linux/types.h>

typedef struct{

int counter;

}atomic_t;

整型原子操作主要用于计数.例如文件打开次数.

主要使用的宏和函数

   ATOMIC_INIT(int i);

  int atomic_read(atomic_t *v);

  void atomic_set(atomic *v,int i);

  int atomic_dec_and_test(atomic *v);  //减1测试是否为0

  int atomic_inc_and_test(atomic *v); 

.....   //其实操作在头文件查看

64位整型原子操作

<asm/atomic.h> 兼容64位CPU和OS

typedef struct{

u64_aligned(8) counter;

}atomic64_t;

位原子操作

主要进行位操作,指定位置0或置1

unsigned long value=0;

set_bit(0,&value);

clear_bit(1,&value);

chang_bit(int nr,void *addr) ;//取反


用原子操作阻止设备文件被多个进程打开.


static int atomic_test_open(struct inode *node,struct file *file)
{
	if(atom)
	{
		if(!atomic_dec_and_test(&int_atomic_avaliable))
		{
			atomic_inc(&int_atomic_avaliable);
			return -EBUSY;
		}
	}
	return 0;
}

static int atomic_test_release(struct inode *inode,struct file *file)
{
	if(atom)
	{
		atomic_inc(&int_atomic_avaliable);
	}
	return 0;
}

module_param(atom,int,S_IRUGO|S_IWUSR);  //参数名称,类型,权限  
在insmod 时 传入参数   例如 insmod atomic_test.ko atom=0





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值