我正在编写一个分配一些内存和用户空间应用程序 mmap()
的 Linux 驱动程序。
现在我正在为该模块编写退出处理程序,并且我试图找出一些安全的假设。
首先,当调用内核模块退出处理程序时,可以安全地假设所有内存都未映射(无论是通过应用程序还是通过内核)?或者我是否必须在释放内存之前在内核驱动程序中手动取消映射?
我问这个是因为内核应该知道模块是否正在退出并且内核还处理取消映射过程。如果内核在调用退出处理程序之前处理取消映射,那么我可以释放内存。如果这是真的,并且如果用户空间应用程序试图访问该内存,那么该应用程序将出现段错误。这是因为虚拟地址不再指向有效的物理内存,或者进程无权访问该页面上的虚拟地址(假设内核取消映射内存)。如果内核驱动程序取消映射内存,也会发生同样的情况。这是真的吗?
最佳答案
在这个阶段退出是不安全的。就是拒绝卸载。
这不是自动的,当进程执行 mmap()
时,您必须增加模块使用计数。
如果你想无礼,就杀死用户进程。
关于linux - 正确释放和取消映射内核内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316748/