内核并发消杀器(KCSAN)技术分析

2023-05-29 08:08:47

变量访问(Variable Access)

使用READ_ONCE()、WRITE_ONCE()和ACCESS_ONCE()宏来保护从共享(但非原子)变量的加载和存储;


【资料图】

内存屏障(Memory Barriers)

一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。比如barrier、smp_mb/smp_wmb/smp_rmb等;

锁操作(Locking Operations)

原子操作(Atomic Operations)

控制依赖(Control Dependencies)

Linux内核提供了一个有限的控件依赖的概念,在某些情况下对依赖控件的存储进行优先加载;

RCU宽限期授权关系(Grace-Period Relationships)

允许更新者等待所有已经存在的读侧临界区完成,再回收旧的资源;

C11原子原语 (C11 Atomics)

C语言和编译器的进化对并发性不敏感

优化编译器正变得越来越丰富

普通访问

标记访问

1.2.2 同步冲突访问的检测条件

在访问同一个地方并且至少有一个是写操作

至少有一个是普通访问(比如x+42)

以下线程打钩的是标准做法;打叉的是可能存在数据竞争的情况。

进入check_access函数,格式描述包含数据指针、长度、读写类型;

确认是否需要观测,需要满足至少一个写操作且为普通访问;

如果判定需要观测,加入观察列表;

延时一段时长,查看是否有访问、变更数据等情况;如果有,则生产数据表,并打印数据到控制台;如果没有则退出;

在步骤3,如果未发现合适的观测点,则该数据运行流程退出

创建多个access_thread线程用于测试用例函数的调用接口;

挂接console跟踪点,该跟踪点监控串口输出数据;如果有数据竞争报错,可以捕获并判断;

启动测试用例接口函数,实现测试函数的挂接并提供超时判定(缺省执行500毫秒);

在执行超时以后,判断输出是否与预想一致;并给出判断结果。

2.断言函数数据竞争assert_exclusive_x

2.后台会实时进行观测点的监控与比对,如果比中会有”BUG:KCSAN”控制台打印来描述数据竞争的信息;这些信息包括调用函数、数据竞争地址、CPU号、进程号等;可在不同的测试场景进行压力测试;

3.在运行过程中,查看“KCSAN kernel debug”节点查看当前的状态,这些状态信息包括观测点、数据竞争、ASSERT报错等一系列信息;

关键词:

为你推荐