8

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

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

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

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

4

2 回答 2

11

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

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

于 2012-07-25T20:58:58.753 回答
6

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

我这是什么意思?

正常进程一旦退出就会为它们进行清理,内核模块并非如此,因为它们不是真正的进程。

从技术上讲,当您加载一个模块然后调用 kmalloc 时,您所做的是您要求内核在内核空间中为您分配一些内存,从技术上讲,它是整个内核的新内存,因此即使您卸载模块,除非显式释放,否则分配的内核内存就在那里。

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

于 2012-07-25T21:16:27.043 回答