为了测试内核在泄漏内存时的行为,我正在编写一个内核模块,用于连续分配内存。代码看起来像如何确定Linux内核模块是否泄漏内存
int bytesLeaked = 128000;
char *var = kmalloc(bytesLeaked, GFP_KERNEL);
if (var != NULL)
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var);
此代码位于init_module中。我有以下问题
- 如何确定代码是否泄漏了内存? lsmod并没有透露太多。
- 互联网上的教程只显示init_module和exit_module中的代码。如果我希望在插入模块之后但退出之前的一段时间内完成内存分配。
- 我是否可以编写泄漏内存的代码,只有当用户给出指令时才会这样做,例如,用户空间程序是否可以执行系统调用,从而导致模块泄漏内存?当它分配的内存块(诸如与
kmalloc()
),然后输给该存储器块的所有参考文献而没有第一释放它
re 1:内存泄漏的定义属性是从不释放分配,不一定没有对它的引用。另外,'var'可能会在某个时间点超出范围,届时您的引用计数将变为0。 (让我们忽略“参考”在C语言中没有明确定义的事实。) – Karmastan 2011-05-06 19:18:30
谢谢。我试图编写线程的产卵,但代码非常复杂http://www.scs.ch/~frey/linux/kernelthreads.html。你能否提供一个关于如何在没有系统调用的情况下通过用户空间事件触发内存分配的见解。 – kakinada 2011-05-09 07:08:26
KEDR支持2.6.31或更新的内核版本。矿是2.6.28。看起来像KEDR不能使用。我会尝试找到类似的内核工具,我有 – kakinada 2011-05-09 07:24:07