kmemleak是Linux内核中的一个功能,用于检测内存泄漏。内存泄漏是指在使用没有垃圾回收机制的语言(如C/C++)时,由于忘记释放内存而导致内存被耗尽的情况。同样地,内核也需要管理自己的内存,因此也可能出现内存泄漏的情况。为了能够找出导致内存泄漏的地方,Linux内核开发者开发了kmemleak功能。
下面是kmemleak的原理和实现:
造成内存泄漏的原因:
memblock_alloc
、kmalloc
、vmalloc
、kmem_cache_alloc
等函数申请的内存。内核中的指针:
记录动态内存块:
memblock_alloc
、kmalloc
、vmalloc
、kmem_cache_alloc
等函数申请的内存是否存在泄漏。kmemleak_object
对象来记录这些内存块的信息,并通过一棵红黑树将这些对象组织起来。kmemleak实现:
kmemleak_object
对象来记录动态内存块的信息,其中rb_node
字段用于将对象连接到红黑树中,pointer
字段记录内存块的起始地址,size
字段记录内存块的大小。kmalloc
函数申请内存时,最终会调用create_object
函数来创建kmemleak_object
对象,并将其添加到全局红黑树中。Learn more:
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 许可协议。转载请注明出处!