【问题标题】:Proper freeing and unmapping of kernel memory正确释放和取消映射内核内存
【发布时间】:2012-07-04 05:30:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我怀疑无论您分配和映射什么,您都将负责清理自己。不过不确定。
  • 我对分配是肯定的,但对映射不确定,因为这是由用户空间完成的,munmap() 完全由内核处理。

标签: linux kernel mmap dynamic-memory-allocation


【解决方案1】:

现阶段退出并不安全。只是拒绝卸载。

这不是自动的,您必须在处理mmap() 时增加您的模块使用次数。

如果你想粗鲁,杀掉用户进程。

【讨论】:

  • 好的,所以我应该禁止模块卸载,直到所有内存都未映射。由于内核控制了mumap() 系统调用,如何处理?
  • 你的应用程序mmap() 是怎么做到的?作为块设备?作为/sysfs 条目?还是procfs?调试文件?
  • 正在映射字符设备。
  • release 操作应该做。
猜你喜欢
  • 1970-01-01
  • 2021-04-21
  • 2020-11-28
  • 1970-01-01
  • 2020-06-25
  • 2020-06-23
  • 2023-03-11
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多