linux - 正确释放和取消映射内核内存

标签 linux kernel mmap dynamic-memory-allocation

我正在编写一个分配一些内存和用户空间应用程序 mmap() 的 Linux 驱动程序。

现在我正在为该模块编写退出处理程序,并且我试图找出一些安全的假设。

首先,当调用内核模块退出处理程序时,可以安全地假设所有内存都未映射(无论是通过应用程序还是通过内核)?或者我是否必须在释放内存之前在内核驱动程序中手动取消映射?

我问这个是因为内核应该知道模块是否正在退出并且内核还处理取消映射过程。如果内核在调用退出处理程序之前处理取消映射,那么我可以释放内存。如果这是真的,并且如果用户空间应用程序试图访问该内存,那么该应用程序将出现段错误。这是因为虚拟地址不再指向有效的物理内存,或者进程无权访问该页面上的虚拟地址(假设内核取消映射内存)。如果内核驱动程序取消映射内存,也会发生同样的情况。这是真的吗?

最佳答案

在这个阶段退出是不安全的。就是拒绝卸载。

这不是自动的,当进程执行 mmap() 时,您必须增加模块使用计数。

如果你想无礼,就杀死用户进程。

关于linux - 正确释放和取消映射内核内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11316748/

相关文章:

linux - 显示两个目录之间的变化

linux - 是否可以增加 ksh 变量接受的最大字符数?

c - Linux内核是如何创建/proc/$pid/maps文件的?

linux - linux 套接字内核缓冲区是否交换到磁盘?

c++ - 使用ptrace时mmap的返回值

c++ - mmap的长度是字节数还是页数?

linux - 递归重命名目录名称

file - 无法从 Linux 内核版本 4.2.3 上的内核模块打开/读取文本文件

linux - 如何在 Linux 设备驱动程序中实现内存映射功能?

c++ - 调试嵌入式设备