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

Linux kmalloc()分配的内存是否自动释放?,linux,linux-kernel,device-driver,kernel,kmalloc,Linux,Linux Kernel,Device Driver,Kernel,Kmalloc,我正在编写一个设备驱动程序,其中包括使用kmalloc分配一块内存。当用户程序关闭文件时,将释放该内存。在我的一个实验中,用户程序没有关闭文件就崩溃了 有什么东西可以释放这个内存吗 在另一个实验中,我将kfree()从close()函数移动到module\u exit()函数。当我连续两次运行用户程序时,我再次使用与以前相同的指针调用了kmalloc,而没有首先释放它。因此,我丢失了指向该内存的指针,无法释放它 在我重新启动之前,该内存是否会丢失到系统中,或者在我卸载驱动程序时会被释放?内核内存

我正在编写一个设备驱动程序,其中包括使用
kmalloc
分配一块内存。当用户程序关闭文件时,将释放该内存。在我的一个实验中,用户程序没有关闭文件就崩溃了

有什么东西可以释放这个内存吗

在另一个实验中,我将
kfree()
close()
函数移动到
module\u exit()
函数。当我连续两次运行用户程序时,我再次使用与以前相同的指针调用了
kmalloc
,而没有首先释放它。因此,我丢失了指向该内存的指针,无法释放它


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

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

关闭文件时,应释放与打开的文件描述符相关的所有内存。

当进程出于任何原因退出时(包括
kill-9
),所有打开的文件描述符都将关闭,并调用驱动程序的关闭函数。因此,如果您在那里释放,进程所能做的任何事情都不会使内存在进程死亡后保留。

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

我这是什么意思

正常进程一旦退出就会得到清理,内核模块则不是这样,因为它们不是真正的进程

从技术上讲,当你加载一个模块然后调用kmalloc时,你所做的是让内核在内核空间为你分配一些内存,从技术上讲,它是整个内核的一个新内存,所以即使你卸载你的模块,分配的内核内存也在那里,除非显式释放

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

可能需要重新启动。我可以想象内核不会神奇地释放丢失的内存。正确的方法是挂接程序退出并释放资源。这与清理程序文件描述符的时间相同。