编辑
2023-10-29
linux
00
请注意,本文编写于 559 天前,最后修改于 548 天前,其中某些信息可能已经过时。

kmemleak是Linux内核中的一个功能,用于检测内存泄漏。内存泄漏是指在使用没有垃圾回收机制的语言(如C/C++)时,由于忘记释放内存而导致内存被耗尽的情况。同样地,内核也需要管理自己的内存,因此也可能出现内存泄漏的情况。为了能够找出导致内存泄漏的地方,Linux内核开发者开发了kmemleak功能。

下面是kmemleak的原理和实现:

  1. 造成内存泄漏的原因:

    • 内存泄漏的根本原因是用户没有释放不再使用的动态申请的内存,例如使用memblock_allockmallocvmallockmem_cache_alloc等函数申请的内存。
    • 没有被指针引用的内存通常被认为是不再使用的内存,因为这些内存丢失了其地址信息,导致内核无法再使用它们。
  2. 内核中的指针:

    • 内核中的指针存放在内核数据段、内核栈和动态申请的内存块中。
    • 内核并没有对指针进行记录,因此内核将这些区域中的每个元素都当作指针来处理。
  3. 记录动态内存块:

    • kmemleak机制用于分析由memblock_allockmallocvmallockmem_cache_alloc等函数申请的内存是否存在泄漏。
    • 内核会记录申请到的内存块信息,使用kmemleak_object对象来记录这些内存块的信息,并通过一棵红黑树将这些对象组织起来。
    • 内存泄漏检测的原理是遍历内核中的指针,然后从红黑树中查找是否存在对应的内存块。如果存在没有指针引用的内存块,就表示可能存在内存泄漏。
  4. kmemleak实现:

    • 内核通过kmemleak_object对象来记录动态内存块的信息,其中rb_node字段用于将对象连接到红黑树中,pointer字段记录内存块的起始地址,size字段记录内存块的大小。
    • 当使用kmalloc函数申请内存时,最终会调用create_object函数来创建kmemleak_object对象,并将其添加到全局红黑树中。

Learn more:

  1. 详细讲解Linux内存泄漏检测实现原理与实现 - 知乎
  2. Linux内存泄露之kmemleak原理分析与使用-CSDN博客
  3. Linux内核态内存泄露检测工具详解--Kmemleak-面包板社区

1、kmemleak_object

c
struct kmemleak_object { raw_spinlock_t lock; unsigned int flags; struct list_head object_list; struct list_head gray_list; struct rb_node rb_node; atomic_t use_count; unsigned long pointer; size_t size; unsigned long excess_ref; int min_count; int count; u32 checksum; struct hlist_head area_list; unsigned long trace[MAX_TRACE]; unsigned int trace_len; unsigned long jiffies; /* creation timestamp */ pid_t pid; /* pid of the current task */ char comm[TASK_COMM_LEN]; /* executable name */ };

struct kmemleak_object描述一段通过memblock_alloc、kmalloc、vmalloc、kmem_cache_alloc等函数分配的内存块。此内存块会加入到红黑树object_tree_root和双向链表object_list中。

https://mp.weixin.qq.com/s/Nj1KsgYmxtRrY5O5az4f1g https://mp.weixin.qq.com/s/LIlOLx7VKVcKYRAgDLUByw

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!