由kmalloc()分配的内存是否自动释放?

时间:2012-07-25 19:42:25

标签: linux linux-kernel device-driver kernel kmalloc

我正在编写一个设备驱动程序,除其他外,它使用kmalloc分配一块内存。用户程序关闭文件时释放此内存。在我的一个实验中,用户程序在没有关闭文件的情况下崩溃。

有什么东西可以释放这段记忆吗?

在另一项实验中,我将kfree()close()函数移至module_exit()函数。当我连续两次运行用户程序时,我使用与之前相同的指针再次调用kmalloc,而不是先释放它。因此,我丢失了指向该内存的指针,并且无法释放它。

在我重新启动之前,这个内存是否会丢失到系统中,或者在我卸载驱动程序时它是否会被释放?

2 个答案:

答案 0 :(得分:8)

内核内存永远不会自动释放。这包括kmalloc

文件关闭时,应释放与打开文件描述符相关的所有内存 当进程因任何原因(包括kill -9)退出时,将关闭所有打开的文件描述符,并调用驱动程序的close函数。因此,如果你在那里释放,那么进程无法做任何事情都会使进程终止后内存保持不变。

答案 1 :(得分:3)

请不要将您的用户空间体验与内核编程联系起来。

这是什么意思?

正常进程一旦退出就会对它们进行清理,而内核模块却不是这样,因为它们不是真正的进程。

从技术上讲,当你加载一个模块然后调用kmalloc时,你所做的就是你要求内核在内核空间为你分配一些内存,从技术上讲它是整个内核的新内存,所以即使你卸载了模块,除非明确释放,否则分配内核内存。

简单来说回答你的问题: 每个kmalloc都需要一个kfree,否则只要系统启动,内存就会保留在那里。