为了编译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