摘要:Linux内存非法访问检查工具上新了:KFence
Linux的4月份基本都是在Linux 5.12的开发版本中度过的。如果要说这个期间Linux有什么让人印象深刻的特性或者功能,那KFence一定会有一席之地。
KFence,全称Memory Safety Error Checking,之所以让众多神经麻木、形容枯槁的Linuxer为之虎躯一震,究其原因还是当前内核中的的内存检查工具参差不齐导致----开销不大的内存检测模块功能不够强大;功能强大的呢开销又很大,最典型的就是著名的KASAN,即Kernel Address Sanitizer。
KASAN是一款动态检测user-after-free、out-of-bounds的内存检查工具。自从Linux-3.19进入内核后迅速蹿红,上到五六十岁的mainter,下到一二十岁的学生娃娃,在遇到一些奇怪的内存问题时,打开KASAN功能,多数时候都能够给你带来意外的惊喜。遗憾的是,KASAN虽好却不能托付终身,因为它的开销太大(经典KASAN要消耗总内存1/8,而最新的基于tag的KASAN的开销虽然有所减少但是仍然有1/16)。因而大部分情况下Linuxer与KASAN的缘分可以说是"将恐将惧,置予于怀。将安将乐,弃予如遗",即一般情况下在开发阶段打开KASAN以便尽早在开发阶段发现错误,待到项目开发完毕、测试充分后再关掉KASAN。
说了KASAN这么多,无非就是要承上启下,千呼万唤始出来咱们的KFence。KFence的自我介绍的开场白是"一款低开销、基于采样实现的内存检测工具"。它不仅拥有KASAN的out-of-bounds, use-after-free, invalid-free非法内存访问检查功能,而且开销更低、效率更高。开销有多低呢?低到可以直击部署到生产环境上,用KFence在Linux5.12的pull request的提交说明来讲,这种开销就几乎是0"near zero performance overhead"。
虽然KFence还比较年轻(但是谁不喜欢年轻的呢?而且还优秀),其检测精度也还有待提升,还但是对于那些希望能够将内存非法访问检测工具常态化部署到生产环境的Linux开发/运维人员来说,无疑是一个振奋的消息。试一试吧,还等什么呢?