使用KCSAN捕获并发错误
在Linux内核编程中,并发问题一直是一个棘手的难题。并发错误往往依赖于微妙的时间巧合,很难被观察到。不过,Kernel Concurrency Sanitizer(KCSAN)这个强大的内核框架为我们提供了有效的解决方案。
1. 基本概念:普通访问与标记访问
在深入了解KCSAN之前,我们需要先明确两个基本概念:普通访问(plain access)和标记访问(marked access)。
- 普通访问 :一个普通的C语句访问变量被称为普通访问。
- 标记访问 :通过 READ_ONCE() 、 WRITE_ONCE() 等宏进行的内存访问被称为标记访问。这类访问本质上是原子的,遵循Linux内核内存模型(LKMM)。实际上, atomic_*() 、 refcount_*() 、 smp_load_acquire() 等宏也属于标记访问的范畴。
当至少有一个线程在同一位置并行执行普通访问,且其中一个是写访问时,就会发生数据竞争(data race)。而如果只使用标记访问,则不会出现数据竞争,因为代码具有原子性和内存顺序保证。
2. KCSAN简介
KCSAN是一个强大的内核框架,用于帮助捕获Linux内核(及模块)中的数据竞争问题。它于2020年8月被合并到5.8系列内核中,目前在x86_64平台上可用,对ARM64的支持则是在2022年3月的5.17内核中才实现
超级会员免费看
订阅专栏 解锁全文
45

被折叠的 条评论
为什么被折叠?



