背景
在linux内核和驱动代码中,需要对共享数据进行保护,防止共度资源被并发访问而发生数据覆盖,被访问数据不一致的情况.这些情况可能会造成系统不稳定,且很难跟踪调试.
- 临界区: 访问和操作共享数据的代码段.
- 临界资源: 共享的数据(静态局部变量,全局变量,buffer, 链表等).
- 并发源:访问临界区的线程或执行路径.
内核4种并发源:
- 中断和异常
- 软中断和taskelt
- 内核抢占
- 多处理器并发执行
原子操作
原子操作是指指令以原子方式执行,过程不会被打断.
ARM中使用ldrex与strex指令保证操作的原子性.
在Linux内核中提供了一系统的原子整数操作函数。
ATOMIC_INIT(int i) //在声明一个atmoic_t变量时,将它初始化为i
ATOMIC_INIT(int i) //在声明一个atmoic_t变量时,将它初始化为i
int atmoic_read(atmoic_t *v) //原子地读取整数变量v
void atmoic_set(atmoic_t *v,int i) //原子地设置v值为i
void atmoic_add(atmoic_t *v,int i) //原子地从v值加i
void atmoic_sub(atmoic_t *v,int i) //原子地从v值减i
void atmoic_inc(atmoic_t *v) //原子地从v值加1
void atmoic_dec(atmoic_t *v)