SLUB DEBUG原理

SLUB DEBUG 检测slab 内存泄漏 文章介绍如何定位linux 内核中slab 内存泄漏。 阅读详情

1. 前言

在工作中,经常会遇到由于越界导致的各种奇怪的问题。为什么越界访问导致的问题很奇怪呢?在工作差不多半年的时间里我就遇到了很多越界访问导致的问题(不得不吐槽下IC厂商提供的driver,总是隐藏着bug)。比如说越界访问导致的死机问题,这种问题的出现一般需要长时间测试才能发现,而且发现的时候即使有panic log。你也没什么头绪。这是为什么呢?假设驱动A通过kmalloc()申请了一段内存,不注意越界改写了与其相邻的object的数据(经过我之前一篇SLUB的文章分析,你应该明白kmalloc基于kmem_cache实现的),假设被改写的object是B驱动使用的,巧合B驱动使用object存储的是地址数据,如果B驱动访问这个地址。那么完了,B驱动死了,panic也是怪B驱动。试想一下,这块被改写的object是哪个驱动使用,是不是哪个驱动就倒霉了?并且每一次死机的log中panic极有可能发生在不同的模块。但是真正的元凶却是A驱动,他没事你还不知道,是不是很恐怖?简直是借刀杀人啊!当然,越界访问也不一定会死机。之前就遇到一个很奇怪的问题。有两个全局数组变量(用作存储字符串)分别被模块C和D使用。这两个数组是上层需要显示的name信息。当C和D模块都工作的时候,发现C模块的name显示不对,但是D模块的name显示正常。将D模块remove,发现C模块的name显示正确。当时看了下System.map文件,发现这两个全局数组变量分配的内存是在一起的,由于D模块越界写导致的。而这种情况就不会死机。但是当你遇到这种情况的时候,你很惊讶,怎么会这样?两个模块之间根本就没关系啊!如果完全不借助检测工具去查找问题是相当费时间的。而且有可能还没什么头绪。这种问题我们该怎么定位?因此我们遇到一种debug的手段,可以检测out-of-bounds(oob)问题。刚才的第一种情况就可以SLUB自带debug功能。针对第二种情况就需要借助更加强大的KASAN工具(后续会有文章介绍)。
因此,我们需要一种debug手段帮助我们定位问题。SLUB DEBUG就是其中的一种。但是SLUB DEBUG仅仅针对从slub分配器分配的内存,如果你需要检测从栈中或者数据区分配内存的问题,就不行了。当然了,你可以选择KASAN。本文主要关注SLUB DEBUG的原理,如何定位这些问题的。
SLUB DEBUG检测oob问题原理也很简单,既然为了发现是否越界,那么就在分配出去的内存尾部添加一段额外的内存,填充特殊数字(magic num)。我们只需要检测这块额外的内存的数据是否被修改就可以知道是否发生了oob情况。而这段额外的内存就叫做Redzone。直译过来“红色区域”是不是有种神圣不可侵犯的感觉。
说明:slab是最早加入linux的,在那时只有slab的存在。随着时间的推移slub出现了,slub是在slab基础上进行的改进,在大型机上表现出色。而slob是针对小型系统设计的。由于slub实现的接口和slab接口保持一致(虽然你用的是slub分配器,但是很多函数名称和数据结构还是依然和slab一致),所以有时候用slab来统称slab, slub和slob。slab, slub和slob仅仅是分配内存策略不同。管理的思想基本一致。本篇文章中说的是slub分配器debug原理。但是针对分配器管理的内存,下文统称为slab缓存池。所以文章中slub和slab会混用,表示同一个意思。
注:文章代码分析基于linux-4.15.0-rc3。图片有点走形,请单独点开图片查看。 

2. SLUB DEBUG功能 

SLUB DEBUG可以检测内存越界(out-of-bounds)和访问已经释放的内存(use-after-free)等问题。
2.1. 如何打开功能
重新配置kernel选项,打开如下选项即可。
CONFIG_SLUB=y
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
2.2. 如何使用
程序中的bug如果想用SLUB DEBUG去检测,还需要slabinfo命令。因为,SLUB内存检测功能在某些情况下不能立刻检测出来,必须主动触发,因此我们需要借助slabinfo命令触发SLUB allocator检测功能。和KASAN相比较而言,这也是SLUB DEBUG的一个劣势。毕竟KASAN可以做到在越界问题出现时就报出问题。
slabinfo工具源码位于tools/vm目录。可以使用如下命令编译slabinfo工具(针对ARM64 architecture)。
aarch64-linux-gnu-gcc -o slabinfo slabinfo.c
当系统开机之后,就可以运行slabinfo –v命令触发SLUB allocator检测所有的object,并将log信息输出到syslog。接下来的任务就是查看log信息是否包含SLUB allocator输出的bug log。其实有些bug是不需要运行slabinfo命令即可捕捉,但是有些却必须使用slabinfo –v命令才可以。下一节将会介绍SLUB DEBUG的原理,为你揭开哪些bug不需要slabinfo命令。

3. object layout 

配置kernel选项CONFIG_SLUB_DEBUG_ON后,在创建kmem_cache的时候会传递很多flags(SLAB_CONSISTENCY_CHECKS、SLAB_RED_ZONE、SLAB_POISON、SLAB_STORE_USER)。针对这些flags,SLUB allocator管理的object对象的format将会发生变化。如下图所示。
 12.png
SLUBU DEBUG关闭的情况下,free pointer是内嵌在object之中的,但是SLUB DEBUG打开之后,free pointer是在object之外,并且多了很多其他的内存,例如red zone、trace和red_left_pad等。这里之所以将FP后移就是因为为了检测use-after-free问题,当free object时会在将object填充magic num(0x6b)。如果不后移的话,岂不是破坏了object之间的单链表关系。
3.1. Red zone有什么用
从图中我们可以看到在object后面紧接着就是Red zone区域,那么Red zone有什么作用呢?既然紧随其后,自然是检测右边界越界访问(right out-of-bounds access)。原理很简单,在Red zone区域填充magic num,检查Red zone区域数据是否被修改即可知道是否发生right oob。
可能你会想到如果越过Red zone,直接改写了FP,岂不是检测不到oob了,并且链表结构也被破坏了。其实在check_object()函数中会调用check_valid_pointer()来检查FP是否valid,如果invalid,同样会print error syslog。
3.2. padding有什么用
padding是sizeof(void *) bytes的填充区域,在分配slab缓存池时,会将所有的内存填充0x5a。同样在free/alloc object的时候作为检测的一种途径。如果padding区域的数据不是0x5a,就代表发生了“Object padding overwritten”问题。这也是有可能,越界跨度很大。
3.3. red_left_pad有什么用
red_left_pad和Red zone的作用一致。都是为了检测oob。区别就是Red zone检测right oob,而red_left_pad是检测left oob。如果仅仅看到上面图片中object layout。你可能会好奇,如果发生left oob,那么应该是前一个object的red_left_pad区域被改写,而不是当前object的red_left_pad。如果你注意到这个问题,还是很机智的,这都被你发现了。为了避免这种情况的发生,SLUB allocator在初始化slab缓存池的时候会做一个转换。
 13.png
如果你去追踪kmem_cache_create(),在calculate_sizes()中布局object。区域划分的layout就如同你看到上图的上半部分。当我第一次看到这段代码的时候,我也这么认为。实际上却不是这样的。在struct page结构中有一个freelist指针,freelist会指向第一个available object。在构建object之间的单链表的时候,object首地址实际上都会加上一个red_left_pad的偏移,这样实际的layout就如同图片中转换之后的layout。为什么会这样呢?因为在有SLUB DEBUG功能的时候,并没有检测left oob功能。这种转换是后续一个补丁的修改。补丁就是为了增加left oob检测功能。
做了转换之后的red_left_pad就可以检测left oob。检测的方法和Red zone区域一样,填充的magic num也一样,差别只是检测的区域不一样而已。

4. SLUB DEBUG原理 

经过上一节分析应该很清楚了大概的原理了。从high level考虑,SLUB就是利用特殊区域填充特殊的magic num,在每一次alloc/free的时候检查magic num是否被意外修改。
4.1. magic num
SLUB 中有哪些magic num呢?所有使用的magic num都宏定义在include/linux/poison.h文件。

 
  1. #define SLUB_RED_INACTIVE 0xbb
  2. #define SLUB_RED_ACTIVE 0xcc
  3. /* ...and for poisoning */
  4. #define POISON_INUSE 0x5a /* for use-uninitialised poisoning */
  5. #define POISON_FREE 0x6b /* for use-after-free poisoning */
  6. #define POISON_END 0xa5 /* end-byte of poisoning */

SLUB_RED_INACTIVE和SLUB_RED_ACTIVE用来填充Red zone和red_left_pad,目的是检测oob。POISON_INUSE用来填充padding区域,同样可以用来检测oob,只不过是poison overwrite。POISON_FREE作用是检测use-after-free问题。POISON_END是object可用区域的最后一个字节填充。
4.2. slab缓存池填充
当SLUB allocator申请一块内存作为slab 缓存池的时候,会将整块内存填充POISON_INUSE。如下图所示。
 14.png
然后通过init_object()函数将相关的区域填充成free object的情况,并且建立单链表。注意freelist指针指向的位置,SLUB_DEBUG on和off的情况下是不一样的。主要就是3.3节提到的转换关系。为什么这里填充成free object的情况呢?其实就是为了假装我这里都是free的object,也是符合情理的。object初始化流程如下。
 15.png
4.3. free object layout
刚分配slab缓存池和free object之后,系统都会通过调用init_object()函数初始化object各个区域,主要是填充magic num。free object layout如下图所示。
 16.png
1) red_left_pad和Red zone填充了SLUB_RED_INACTIVE(0xbb);
2) object填充了POISON_FREE(0x6b),但是最后一个byte填充POISON_END(0xa5);
3) padding在allocate_slab的时候就已经被填充POISON_INUSE(0x5a),如果程序意外改变,当检测到padding被改变的时候,会output error syslog并继续填充0x5a。
4.4. alloc object layout
当从SLUB allocator申请一个object时,系统同样会调用init_object()初始化成想要的模样。alloc object layout如下图所示。
 17.png
1) red_left_pad和Red zone填充了SLUB_RED_ACTIVE(0xcc);
2) object填充了POISON_FREE(0x6b),但是最后一个byte填充POISON_END(0xa5);
3) padding在allocate_slab的时候就已经被填充POISON_INUSE(0x5a),如果程序意外改变,当检测到padding被改变的时候,会output error syslog并继续填充0x5a。
alloc object layout和free object layout相比较而言,也仅仅是red_left_pad和Red zone的不同。既然该填充的数据都搞定了,下面就是如何检查oob、use-after-free等问题了。
4.5. out-of-bounds bugs detect
下面使用demo例程来说明oob检测。我们使用kmalloc分配32 bytes内存,然后制造越界访问第33个元素,必然会越界访问。由于kmalloc是基于SLUB allocator,因此此bug可以检测。

 
  1. void right_oob(void)
  2. {
  3. char *p = kmalloc(32, GFP_KERNEL);
  4. if (!p)
  5. return;
  6. p[32] = 0x88;
  7. kfree(p);
  8. }

运行后的object layout如下图所示。
 18.png
我们可以看到,Red zone区域本来应该0xcc的地方被修改成了0x88。很明显这是一个Redzone overwritten问题。那么系统什么时候会检测到这个严重的bug呢?就在你kfree()之后。kfree()中会去检测释放的object中各个区域的值是否valid。Red zone区域的值全是0xcc就是valid,因此这里会检测0x88不是0xcc,进而输出error syslog。kfree()最终会调用free_consistency_checks()检测object。free_consistency_checks()函数如下。

 
  1. static inline int free_consistency_checks(struct kmem_cache *s,
  2. struct page *page, void *object, unsigned long addr)
  3. {
  4. if (!check_valid_pointer(s, page, object)) {
  5. slab_err(s, page, "Invalid object pointer 0x%p", object);
  6. return 0;
  7. }
  8. if (on_freelist(s, page, object)) {
  9. object_err(s, page, object, "Object already free");
  10. return 0;
  11. }
  12. if (!check_object(s, page, object, SLUB_RED_ACTIVE))
  13. return 0;
  14. return 1;
  15. }

1) check_valid_pointer()负责检测object的free pointer指针数据是否valid。oob是有可能导致这种情况得到发生。
2) on_freelist()检测object是否已经free,可以检测多次free的bug。
3) check_object()会检测Red zone区域的数值是否被改变,因此这里就会报出bug。
如果是左边界越界访问,是否也同样可以检测出呢?可以测试以下demo例程。

 
  1. void left_oob(void)
  2. {
  3. char *p = kmalloc(32, GFP_KERNEL);
  4. if (!p)
  5. return;
  6. p[-1] = 0x88;
  7. kfree(p);
  8. }

运行后的object layout如下图所示。
 19.png
检测方法大同小异,这里也是最终在free_consistency_checks()函数中通过检测red_left_pad区域发现left oob问题。
可能你会想如果我只申请内存不释放的话,这个bug还能检测到吗?其实这里是不行的。我们只能借助slabinfo工具主动触发检测功能。所以,这也是SLUB DEBUG的一个劣势,它不能做到动态监测。它的检测机制是被动的。
4.6. use-after-free bugs detect
如果是use-after-free问题,我们该如何检测呢?首先上demo例程。

 
  1. void use_after_free(void)
  2. {
  3. char *p = kmalloc(32, GFP_KERNEL);
  4. if (!p)
  5. return;
  6.  
  7. kfree(p);
  8. memset(p, 0x88, 32);
  9. }

运行之后object layout如下图所示。
 20.png
还记得上面说的吗?SLUB DEBUG是被动的。因此这里就要选择slabinfo工具了。命令中断输入slabinfo –v即可。slabinfo检测的原理也很简单,便利所有已经释放的object,检查object区域是否全是0x6b(最后一个字节oxa5)即可,如果不是的话,自然就是use-after-free。

5. slabinfo 

我们看一下slabinfo –v命令的实现方式以及检查的流程。slabinfo源码位于tools/vm/slabinfo.c文件。slabinfo –v命令执行流程如下图所示。
 21.png
针对系统中每一个slab都会执行set_obj()函数。set_obj()代码如下:

 
  1. static void set_obj(struct slabinfo *s, const char *name, int n)
  2. {
  3. char x[100];
  4. FILE *f;
  5. snprintf(x, 100, "%s/%s", s->name, name);
  6. f = fopen(x, "w");
  7. if (!f)
  8. fatal("Cannot write to %s\n", x);
  9. fprintf(f, "%d\n", n);
  10. fclose(f);
  11. }

set_obj()参数name传递的是“validate”,n传递的是1。作用就是向/sys/kernel/slab/<slab name>/ validate节点写“1”触发slab检测功能。根据validate节点找到写入口函数validate_store()。调用函数执行流如下图所示。
 22.png
validate_slab()代码如下:

 
  1. static int validate_slab(struct kmem_cache *s, struct page *page, unsigned long *map)
  2. {
  3. void *p;
  4. void *addr = page_address(page);
  5. if (!check_slab(s, page) ||
  6. !on_freelist(s, page, NULL))
  7. return 0;
  8. /* Now we know that a valid freelist exists */
  9. bitmap_zero(map, page->objects);
  10. get_map(s, page, map);
  11. for_each_object(p, s, addr, page->objects) {
  12. if (test_bit(slab_index(p, s, addr), map))
  13. if (!check_object(s, page, p, SLUB_RED_INACTIVE))
  14. return 0;
  15. }
  16. for_each_object(p, s, addr, page->objects)
  17. if (!test_bit(slab_index(p, s, addr), map))
  18. if (!check_object(s, page, p, SLUB_RED_ACTIVE))
  19. return 0;
  20. return 1;
  21. }

1) check_slab()会调用slab_pad_check()检查slab padding区域。slab padding和object里面的pading不是一回事。如果说从buddy system分配的页按照SLUB规则平分成很多object,那么有可能不能整除,那么剩下的unused区域就是slab padding。valid的数值是0x5a。如下图所示。
2) get_map()利用bitmap标记所有的available object。例如,slab缓存池一共有10个对象,按地址大小排序标号0-9(相当于index)。假设5和8号object已经被分配出去。那么bitmap中除了bit5和bit8以为,其余位为1。
3) 第一个for循环遍历所有的available object是否有oob、use-after-free、object padding overwritten等问题发生。
4) 第二个for循环遍历所有已经分配出去的object是否发生oob问题。

 23.png

 

原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。

宋牧春: Linux内核slab内存的越界检查——SLUB_DEBUG 本文简介:SLAB内存分配器-SLUB的DEBUG功能,如何帮忙检测内存越界(out-of-bounds)和访问已经释放的内存(use-after-free)。本文目录:1. 前言2. SLUB DEBUG功能3. object layout4. SLUB DEBUG原理5. slabinfo作者简介:宋牧春,linux内核爱好者,2017年6月本科毕业于江苏大学。现就职于一家手机研发公司,任职B 阅读详情

相关推荐

Linux内核SLUB调试功能

SLUB 作为 Linux 内核内存管理的核心组件,其内置调试功能为内存损坏问题提供了 “原生、轻量、精准” 的解决方案。它不仅能覆盖 UMR、UAF、OOB 等常见 bug 类型,还能与 KASAN、UBSAN 形成互补(例如 SLUB 更适合轻量场景,KASAN 更适合全量内存检测)。本文通过一个简单的内核模块演示了slub debug对double free的检测,实际应用中可以检测很多其他类型的bug。

u010826758的专栏 62

使用slub(slab)的调试功能‏

使用slub(slab)的调试功能‏ 发表评论作者 lp007819 on 2012年01月25日 在日常开发工作中最容易发生的错误十有八九都是出在线性空间的操作方面。(这里指的线性空间可以认为等同于虚拟地址或虚拟内存,但其他场合并不一 定适用) 主要的问题体现在: 1. 访问了未初始化的线性空间。 这类问题还是相对比较容易发现,因为内核立即会告警并打印堆栈。 2.

smile 4021

东方财富网 数据访问接口及字段说明

东方财富网 数据访问接口和字段说明

雨中山草 2万+

linux kernel内存泄漏检测工具之slub debug

ko中的实现基本就是将slub.c,slab_common.c中的依赖的结构体,函数等重写一下,注册好上面的两个hook函数,一个替换掉kmalloc_caches, 一个存储slub分配的调用栈,剩下的就是处理好编译报错,将/sys/kernel/debug/slab/XXX/alloc_traces 的实现用在新增的ko中,增加调试节点,即可完成动态开启slubdebug的功能。如果版本存在SLUB内存泄漏, 抓取/proc/slabinfo或者使用slabinfo 工具来确认泄漏的slub 类型;

yanghao23的专栏 5300

手把手复现论文:SVPWM过调制I区与II区算法仿真(附MATLAB源码)

本文详细介绍了SVPWM过调制I区与II区算法的MATLAB仿真实现,从理论推导到Simulink建模逐步解析。通过源码示例展示幅值补偿和六边形跟踪等关键技术,帮助电力电子研究者掌握过调制算法的核心实现方法,适用于电机控制、变频器等工业应用场景。

weixin_28739079的博客 530

CTF逆向实战:如何快速识别RC4、TEA和Base64的魔改变种?

本文针对CTF逆向比赛中常见的加密算法魔改问题,详细讲解了如何快速识别和破解RC4、TEA和Base64的变种。通过分析算法核心特征、常见魔改手法,并结合动态调试与脚本编写等实战技巧,帮助逆向分析人员有效应对算法混淆,提升解题效率。

agile9scrum的博客 784

slub debug

slub debug工具介绍

lzhf1122的博客 1271

SAP物料主数据表结构全解析:ABAP开发与MM模块必知必会

本文深入解析SAP物料主数据的核心表结构,涵盖MARA、MAKT、MARC、MARD及MVKE等关键表。详细阐述了物料主数据在ABAP开发和MM模块中的存储逻辑与关联关系,帮助开发者和顾问高效处理数据查询、增强功能及业务故障排查,是掌握SAP物料管理基础的必读指南。

weixin_29216957的博客 379

slub debug原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33877885的博客 1495

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 567

Unity2D像素刀光实现:粒子方向控制与像素级渲染规范

像素风游戏中的刀光特效并非普通粒子动画,而是需严格遵循像素艺术原理的视觉暂留模拟。其核心在于将‘瞬时切割感’转化为程序可执行的渲染逻辑:通过禁用纹理滤波保障1:1像素锐度,绑定刀锋向量控制粒子运动方向,限定≤0.15秒生命周期匹配人眼暂留阈值,并采用Stretched Billboard实现动态拉伸拖影。该方案兼顾美术语义(如直劈、横扫、突刺)与工程约束(Sorting Layer分层、对象池复用、单粒子GPU优化),广泛适用于Unity2D平台的动作反馈系统,尤其适配《空洞骑士》《死亡细胞》类高节奏像素R

weixin_32390647的博客 283

SLUB DEBUG实战:从原理到排查slab内存泄漏

Linux内核内存管理采用伙伴系统与SLUB分配器相结合的分层架构,SLUB负责将物理页切割为大小固定的对象,供驱动和内核模块快速分配。当对象被分配后未正确释放,便会形成slab内存泄漏,典型表现是/proc/slabinfo中active_objs持续增长,系统内存逐渐被蚕食。SLUB DEBUG是内核内置的运行时检测机制,通过启用user tracking等选项,能够记录每个对象的分配和释放调用栈,将泄漏源直接暴露到具体函数。在kmemleak和KASAN难以覆盖小对象泄漏场景时,SLUB DEBUG配

weixin_32642109的博客 159

PyTorch实战:3D U-Net医学图像分割从零搭建(附完整代码)

本文详细介绍了如何使用PyTorch从零搭建3D U-Net模型进行医学图像分割,涵盖三维卷积实现、模块化架构设计、医学图像专属优化策略及完整训练流程。通过实战代码演示,帮助开发者掌握UNet-3D在CT、MRI等三维医学图像分割中的应用,提升肝脏肿瘤分割、肺结节检测等任务的准确性。

weixin_29061997的博客 329

Linux内核slub_debug内存调试原理与实战指南

slub_debug是Linux内核SLUB分配器内置的轻量级内存诊断机制,通过红区(Redzone)、毒化(Poisoning)、调用栈追踪等技术,在对象层注入可观测性元数据,实现对kmalloc内存分配/释放行为的精细化监控。其核心价值在于提供确定性的内存异常定位能力——不同于KASAN的全局插桩与高开销,slub_debug以编译时可选、启动时按缓存粒度动态启用的方式,在性能与可观测性间取得工程平衡。它广泛应用于内核模块开发、use-after-free根因分析、slab缓存生命周期验证及嵌入式系统内

weixin_34060741的博客 341

多维时空数据介绍(4)多维栅格数据构建

上图中包含了经度、纬度和时间三个维度,其变量为经度、纬度、时间以及降雨量,对应的变量单位为东经多少度、北纬多少度、阳历1895-1-1日开始多少天以及每年降雨多少毫升,其中经度数值4个、纬度数值3个、时间数值2个都是一维的数据,而降雨量是一个包含经度、纬度、时间的三维数组,数值有4*3*2=24个。在GeoScene 中NetCDF数据可以用做多种多维时空数据的数据源,进行创建、可视化和分析,它可以是多维栅格数据、时空立方体,还可以是体元图层,区别在于其所要表示的内容和目的。变量又分为坐标变量和属性变量。

你好,我是小张同学! 1286

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux内核slub_debug内存校验原理与实战指南

SLUB是Linux内核主流内存分配器,其调试机制slub_debug并非交互式调试工具,而是一套轻量级、运行时内存健康监测探针系统。它通过红区标记(Redzone)、填充区染色(Poisoning)、分配清零(Zeroing)和调用栈跟踪(Tracking)等技术,在kmalloc/kfree关键路径实时校验内存完整性。相比KASAN等重型工具,slub_debug具备低开销、原生集成、启动早期生效等工程优势,特别适用于嵌入式系统、驱动开发及生产环境灰度监控。本文深入解析F/Z/P/U/O参数组合的检测维

weixin_33884611的博客 390

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

内核内存泄漏排查:slub debug 原理与实战指南

面对内核内存泄漏,难以定位时,SLUB 分配器自带的 slub debug 框架往往是第一选择。它内置了 Poison、Red Zone、Store User、Sanity Checks 等机制,可动态配置,实现在 kmalloc/kfree 链路上的精细追踪与定向检测。文章从 SLUB 分配器的设计思想出发,解析了 slub debug 的四大核心机制原理,并展示一次 kmalloc 泄漏的实战排查过程,包括 sysfs 接口操作、调用栈分析、以及性能开销和误报处理等避坑经验,助力开发者快速揪出泄漏源,并

weixin_29248611的博客 166

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SLUB DEBUG实战:从slabinfo到调用栈定位内核内存泄漏

内核内存管理是系统稳定性的基石,而slab分配器作为内核对象缓存的核心机制,其内存泄漏往往隐蔽且难以察觉。应用层泄漏可通过进程内存观测,但slab层泄漏深藏于分配器内部,常规top、ps、dmesg均无法暴露,唯有依赖SLUB DEBUG机制深入内核才能真正定位。SLUB DEBUG通过编译选项、启动参数与sysfs运行时开关,提供poisoning、redzone、track调用栈等检测能力,可精确捕捉对象越界、 use-after-free及未释放路径。借助/proc/slabinfo中active_o

weixin_32715349的博客 293

slub_debug实战:从SLUB账本到内核内存泄漏定位

内存泄漏是系统编程中的经典难题,尤其在内核态,由于缺乏进程退出时的自动回收机制,泄漏对象会持续消耗系统内存。SLUB作为内核默认的slab分配器,其内部维护着详细的对象分配与释放账本,通过/proc/slabinfo可观察缓存水位变化,而slub_debug参数则提供了从分配器视角捕捉泄漏证据的调试能力。其中User tracking功能可以精确记录每个对象的分配调用栈,帮助定位只分配不释放的代码路径。与kmemleak的可达性扫描不同,slub_debug更擅长针对特定缓存做精细化追踪,两者互补可覆盖大多

weixin_42525005的博客 215

内存检测技术(slub_debug/kmemleak/kasan)

关键词:slub_debug、kmemleak、kasan、oob、Redzone、Padding。   Linux常见的内存访问错误有: 越界访问(out of bounds) 访问已经释放的内存(use after free) 重复释放 内存泄露(memory leak) 栈溢出(stack overflow) 不同的工具有不同的侧重点,本章主要从slub_debug、kmemleak、kasan三个工具介绍。 kmemleak侧重于内存泄露问题发现。 slub_debug和kasan有一

biaotai的博客 2153

Linux内核slab内存泄漏排查:SLUB DEBUG精准定位实战指南

内存泄漏是Linux内核开发中常见的稳定性隐患,尤其以slab分配器层的对象泄漏最为隐蔽,常表现为系统内存缓慢耗尽而难以溯源。理解SLUB分配器的工作机制是排查的基础,它通过kmem_cache管理固定大小的对象,一旦对象有借无还,对应cache的active_objs就会持续增长。SLUB DEBUG作为内核内置的检测机制,通过记录分配与释放调用栈、设置red zone、poison填充等手段,能够精准定位到具体调用点,相比kmemleak更具针对性和效率。在嵌入式、驱动开发及BSP适配等场景中,借助sl

weixin_28675839的博客 328

Linux内核SLUB Debug实战:从slab内存泄漏到越界写与UAF定位

内核内存管理是驱动开发和系统稳定性的基石,其中slab分配器负责小对象的缓存与复用,而SLUB作为主流架构默认实现,其调试能力直接影响疑难内存问题的定位效率。从基础概念看,slub debug通过在对象边界填充red zone、在空闲对象注入poison字节,能够高效检测越界写、释放后使用(UAF)、重复释放等内存破坏事故;对于指针丢失型内存泄漏,则需结合store_user调用栈对比或kmemleak扫描。实际工程中,通过/proc/slabinfo观察活跃对象增长趋势,配合sysfs定向开启调试开关,可

weixin_29239279的博客 262

手把手教你Linux内存管理(22)内存检测技术(slub_debug/kmemleak/kasan) [超详细]

inux常见的内存访问错误有: 越界访问(out of bounds) 访问已经释放的内存(use after free) 重复释放 内存泄露(memory leak) 栈溢出(stack overflow) 不同的工具有不同的侧重点,本章主要从slub_debug、kmemleak、kasan三个工具介绍。 kmemleak侧重于内存泄露问题发现。 slub_debug和kasan有一定的重复,部分slub_debug问题需要借助s

youzhangjing_的博客 1826

[内核内存] linux内核态内存检测技术

文章目录1 slub_debug**内核配置****slabinfo工具编译****系统加载内核启动参数 ****功能****实例****右越界访问:****slub_debug实现原理** linux常见的内存错误访问: 越界访问(out of bounds) 访问已经释放的内存(use after free) 重复释放 内存泄露(memory leak) 栈溢出(stack overflow) a. 对于内核内存泄露问题--->kmemleak工具 b. 对越界访问,重复释放,栈溢出和访问已

菁的博客 2304

Linux内核内存管理:SLAB、SLUB与SLOB分配器解析与排障指南

内存管理是Linux内核的基石,物理内存的分配首先依赖伙伴系统以页为单位管理,但内核中大量小对象(如文件描述符、进程描述符)的频繁创建销毁,若直接向伙伴系统申请整页内存,不仅浪费严重,还会产生高昂的初始化和锁开销。为解决这一痛点,slab缓存机制应运而生,通过缓存相同尺寸的对象来提升分配效率。在长期演进中,SLAB、SLUB和SLOB三种分配器分别代表了精雕细琢、简洁高效与极致省内存三种设计路线:现代服务器默认采用SLUB,其per-CPU机制在并发场景下表现优异;SLOB则仅适用于几MB内存的嵌入式环境。

weixin_30219613的博客 219

linux内核 UAF

摘要:UAF(释放后使用)是内核态高危漏洞,指内存释放后仍被访问。攻击者可利用UAF篡改关键数据结构(如cred、file_operations)实现提权,典型步骤包括:控制堆布局、篡改内核结构、绕过防护机制(KASLR/SMEP)。防御措施包括启用KASAN检测、释放后清空指针、加固SLUB分配器等。KASAN通过影子内存标记有效捕获UAF,是开发阶段重要检测工具。

tangzhangyin的专栏 625
上一篇: 图解slub
下一篇: THE HASH
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值