Nat*_*man 6 linux kernel device-driver linux-kernel kmalloc
我正在编写一个设备驱动程序,除其他外,它分配一块内存kmalloc.用户程序关闭文件时释放此内存.在我的一个实验中,用户程序在没有关闭文件的情况下崩溃.
有什么东西可以释放这段记忆吗?
在另一个实验中,我将函数kfree()从close()函数移动到module_exit()函数.当我连续两次运行用户程序时,我kmalloc再次使用与之前相同的指针进行调用,而不是先将其释放.因此,我丢失了指向该内存的指针,并且无法释放它.
在我重新启动之前,这个内存是否会丢失到系统中,或者在我卸载驱动程序时它是否会被释放?
内核内存永远不会自动释放.这包括kmalloc.
文件关闭时,应释放与打开文件描述符相关的所有内存.
当进程退出时,无论出于何种原因(包括kill -9),都会关闭所有打开的文件描述符,并调用驱动程序的close函数.因此,如果你在那里释放,那么进程无法做任何事情都会使进程终止后内存保持不变.
请不要将您的用户空间体验与内核编程联系起来。
我这是什么意思?
正常进程在退出后会对其进行清理,内核模块不是这种情况,因为它们不是真正的进程。
从技术上讲,当您加载一个模块然后调用 kmalloc 时,您所做的是要求内核在内核空间中为您分配一些内存,从技术上讲,它是整个内核的新内存,因此即使您卸载模块,除非明确释放,否则分配的内核内存在那里。
用简单的术语回答您的问题:每个 kmalloc 都需要一个 kfree,否则只要系统启动,内存就会保留在那里。
| 归档时间: |
|
| 查看次数: |
2612 次 |
| 最近记录: |