内核内存错误检测工具KFENCE【转】

转自:https://www.cnblogs.com/linhaostudy/p/15629244.html

正文

Linux 5.12引入一个新的内存错误检测工具:KFENCE(Kernel Electric-Fence,内核电子栅栏)。KFENCE是一个低开销的、基于采样的内存错误检测工具。KFENCE检测越界访问、释放后使用和非法释放(包括重复释放和释放的起始地址不是分配的起始地址)这3种错误。

KFENCE和KASAN是互补的。KASAN可以检测KFENCE支持的所有缺陷种类。KASAN依靠编译器插桩,对每个内存访问都检查地址的合法性,更精确,但是导致内核的性能下降,所以KASAN只适合测试环境。KFENCE使用采样的方法,牺牲了精度,但是性能开销几乎为零,它被设计为在产品内核中使用,发现在测试环境中测试用例没有执行的代码路径中的缺陷。

目前只有x86_64和ARM64两种架构支持KFENCE。
回到顶部

1. 使用方法

KFENCE的配置宏如下。

(1) 配置宏CONFIG_KFENCE。

(2) 配置宏CONFIG_KFENCE_SAMPLE_INTERVAL,用来指定采样间隔,单位是毫秒,默认值是100毫秒。把这个配置宏设置为0表示默认禁止KFENCE。

(3) 配置宏KFENCE_NUM_OBJECTS,用来指定KFENCE内存池里面的对象数量,取值范围是1~65535,默认值是255。

可以使用内核启动参数”kfence.sample_interval”在启动时指定采样间隔,单位是毫秒,设置为0表示禁止KFENCE。

KFENCE通过debugfs文件系统提供了一些调试信息,如下。

(1) 文件”/sys/kernel/debug/kfence/stats”提供运行时的统计值。

(2) 文件”/sys/kernel/debug/kfence/objects”提供通过KFENCE分配的对象的列表,包括已经释放但是受保护的对象。
回到顶部

2. 技术原理

KFENCE使用一个固定长度的内存池,如图2.1所示。配置宏CONFIG_KFENCE_NUM_OBJECTS指定对象的数量。每个对象需要2页,一页用来存放对象自身,另一页用作警戒页(guard page)。对象页和警戒页交替出现,每个对象页被两个警戒页包围。内存池的长度是”(对象数量 + 1)× 2 ×页长度”。第1页不是必需的,增加这一页是因为分配偶数个物理页可以简化把对象页地址转换为对象索引的计算。

内核内存错误检测工具KFENCE【转】

在采样间隔到期以后,下一次从SLAB分配器(或者SLUB分配器)分配内存的时候,从KFENCE内存池分配一个对象(只支持分配长度不超过一页),如果内存池用完了,那么返回空指针,由SLAB分配器分配。

如果访问对象的时候越界访问到警戒页,那么触发页错误异常。在页错误异常处理程序里面,KFENCE拦截页错误异常,报告一个越界访问,如果开启了”panic_on_warn”(通过内核启动参数”panic_on_warn”开启,或者执行命令”echo 1 > /proc/sys/kernel/panic_on_warn”开启),那么重启设备,否则把正在访问的警戒页设置为可以访问,让出错的代码继续执行。

为了检测出在对象页里面的越界写,KFENCE使用红色区域。对象页有2种布局,如下。

(1)如图2.2所示,对象在对象页的前半部分,红色区域在对象页的后半部分。这种布局有利于检测左越界,如果向左越界访问左边的警戒页,就会触发页错误异常。

内核内存错误检测工具KFENCE【转】

图2.2 对象在对象页的前半部分

(2)如图2.3所示,对象在对象页的后半部分,红色区域在对象页的前半部分。这种布局有利于检测右越界,如果向右越界访问右边的警戒页,就会触发页错误异常。

内核内存错误检测工具KFENCE【转】

图2.3 对象在对象页的后半部分

KFENCE在每次分配对象的时候,随机选择一种布局,并且用特定的字符填充红色区域。释放对象的时候,检查红色区域里面的字符是否变化,如果变化,那么报告错误。

释放一个KFENCE对象的时候,KFENCE把对象页设置为不可访问,并且把对象标记为空闲。继续访问这个对象就会触发一个页错误异常,KFENCE报告一个”释放后使用”错误。为了增加检测出”释放后使用”的机会,KFENCE把空闲对象插入空闲链表的尾部,让最早释放的空闲对象先被分配出去。

如果您觉得阅读本文对您有帮助,请点一下"推荐"按钮,您的"推荐"将是我最大的写作动力!

Original: https://www.cnblogs.com/sky-heaven/p/16423425.html
Author: sky-heaven
Title: 内核内存错误检测工具KFENCE【转】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547065/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • <semaphore.h> 和 <sys/sem.h> 的区别

    “semaphore.h” 和 “sys/sem.h”是两种不同的实现并提供不同的功能集 <sys sem.h><…

    技术杂谈 2023年7月24日
    063
  • MySQL InnoDB缓存

    1. 背景 对于各种用户数据、索引数据等各种数据都是需要持久化存储到磁盘,然后以”页”为单位进行读写。 相对于直接读写缓存,磁盘IO的成本相当高昂。 对于读…

    技术杂谈 2023年6月21日
    094
  • 描述高频题之队列&栈

    栈和队列 全文概览 基础知识 栈 栈是一种先进后出的数据结构。这里有一个非常典型的例子,就是堆叠盘子。我们在放盘子的时候,只能从下往上一个一个的放;在取的时候,只能从上往下一个一个…

    技术杂谈 2023年7月25日
    059
  • EdgeView 3 for Mac(苹果Mac电脑图片查看软件)中文

    Original: https://www.cnblogs.com/aurora-123/p/16873520.htmlAuthor: 佛系女孩Title: EdgeView 3 …

    技术杂谈 2023年7月10日
    068
  • 一个被封禁的开源框架

    前言 2年前曾整过一个开源框架——违禁词过滤框架LiteBanner。 算是一个工具类的,当时放在开源中国。因为小巧性能高,还可以自定义词库,获得了不少人的star。 因为框架自带…

    技术杂谈 2023年7月11日
    056
  • 2021.07.13 我们是这样崩的

    至暗时刻 2021年7月13日22:52,SRE收到大量服务和域名的接入层不可用报警,客服侧开始收到大量用户反馈B站无法使用,同时内部同学也反馈B站无法打开,甚至APP首页也无法打…

    技术杂谈 2023年5月30日
    081
  • Game Engine Architecture 9

    【 Game Engine Architecture 9】 1、Formatted Output with OutputDebugString() int VDebugPrintF…

    技术杂谈 2023年5月31日
    080
  • 还在用BeanUtils拷贝对象?MapStruct才是王者!【附源码】

    前几天,远在北京的小伙伴在群里抛出了 &#x201C;MapStruct&#x201D;的概念。对于只闻其名,未见其人的我来说,决定对其研究一番。本文我们就从 Ma…

    技术杂谈 2023年7月11日
    0119
  • 测试左移和测试右移,我们为何要“上下求索”?

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/7b9ad46d.html 你好,我是测试蔡坨坨。 今天,我们来聊一聊测试左移和测试右移。 传统测试流程…

    技术杂谈 2023年7月11日
    072
  • Transformer算法完全解读

    什么是注意力? 我们观察事物时,之所以能够快速做出判断,是因为我们大脑能够将注意力能够以高分辨率接收于图片上的某个区域,并且以低分辨率感知其周边区域,并且视点能够随着时间而改变,换…

    技术杂谈 2023年7月24日
    067
  • xx

    http://news.xinhuanet.com/politics/2017-10/17/c_1121814199.htm Original: https://www.cnblo…

    技术杂谈 2023年5月31日
    077
  • PPPOE

    PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中…

    技术杂谈 2023年5月31日
    081
  • Mysql之Binlog

    1、简述 binlog 二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。 2、Docker中无法…

    技术杂谈 2023年6月21日
    0157
  • 通过grub-install命令把grub安装到u盘-总结

    制作步骤: 先用cfdisk 在U盘中,创建个两个分区,第二个一会儿作为boot分区。 0:mkfs.ext3 /dev/sdc51:mount /dev/sdc5 /tmp/bo…

    技术杂谈 2023年6月1日
    071
  • html大文件分段传输

    总结一下大文件分片上传和断点续传的问题。因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较大时,ht…

    技术杂谈 2023年5月30日
    0108
  • 十大经典排序算法(动图演示)

    转自:https://www.cnblogs.com/onepixel/articles/7674659.html 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类:…

    技术杂谈 2023年6月1日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球