假如通过“Free”查看内存几乎耗尽,但通过 top/ps 命令却看不出来用户态应用程序占用太多的内存空间, 那么内核模块可能发生了内存泄露
SLAB 是Linux内核中按照对象大小进行分配的内存分配器。
通过SLAB的信息来查看内核模块占用的内存空间:
方法1 查看meminfo文件
方法2 查看slabinfo文件
一般查看slabinfo文件就足以,如果发现slabinfo中占用内存过大,那基本可以断定,内核模块出现了内存泄露了
还有个命令 slabinfo 也是可以看,其实也是去读 /proc/slabinfo 后可视化出来
Linux内核的Kmemleak实现内存泄露检测
看看下面这个函数是哪里导致的内存泄漏呢?
一眼可能不容易看出上面的有什么问题,有kmalloc,有kfree 成对出现的。
问题正好出在 pr_debug 这个函数中的参数传递, 熟悉函数调用传参的人应该会知道编译器一般对参数的处理采用堆栈的方式,是一个先进后出的过程,这样参数的执行一般是逆序的(由于编译器实现的不同,这个过程不是确定的),这样kfree会在kmalloc之前运行,导致每次运行都会泄漏一点内存。
Resolving Memory Leaks In Linux Kernel
Slab Allocator
Proc Info
Using Crash Debugger
什么是模块:
模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是其代码可以在运行时链接到系统中作为内核的一部分运行或从内核中取下,可以动态的扩展内核的功能。
内核模块和应用程序的比较
应用程序: 模块程序:
入口: main() init_modle()
出口: 无 cleanup_module()
编译: gcc -c gcc -c -DMODULE -D__KERNEL__
连接: gcc insmod
运行: 直接运行 insmod
调试: gdb kdbug,kdb,kgdb等内核调试工具
文件类型:EXEC(可执行文件) REL(可重定位文件)
模块机制的优缺点:
优点:
1,使得内核更加紧凑灵活
2,修改内核时, 不必重新编译整个内核
3,模块可以不依赖于某个固定的硬件平台,即使它依赖于某系统特殊的硬件特点
4,模块的目标代码一旦被链接到内核,它的作用和静态链接的内核目标代码完全等价所以当调用模块函数时,无须显式的消息传递
缺点:模块机制带来安全上的隐患
1,截获系统调用
2,修改输出符号表
3,通过修改系统调用,使模块自己隐性
4,重定向文件 *** 作
5,修改文件属主
6,隐藏进程
7,重定向可执行文件
8,通过修改系统调用sys_socketcall,使得系统在收到指定数据包后打开后门
9,TTY劫持
10,病毒
参考资料:
比如Intel开源的图形界面驱动位于内核的:
/lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/i915ko
Nvidia的闭源驱动则以 DKMS 动态内核模块放置在 :
/lib/modules/`uname -r`/updates/dkms/
Dynamic Kernel Module Support Framework
DKMS is a framework designed to allow individual kernel modules to be upgraded without changing the whole kernel It is also very easy to rebuild modules as you upgrade kernels
动态内核模块DKMS的用途包括:
在不影响现有内核的情况下,安装新的模块到现有系统上,比如Nvidia和AMD的闭源驱动程序
当你更新内核时,将非常容易重建模块,比如VirtualBox在Linux上的虚拟化驱动
以上就是关于Linux Kernel模块内存泄露分析全部的内容,包括:Linux Kernel模块内存泄露分析、什么是模块、请教Linux中内核模块(ko)开源和闭源的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)