如何取消映射使用remap_pfn_range()

时间:2015-12-03 07:33:16

标签: c linux-kernel arm

将内核内存映射到用户空间有多种方法。 有人说使用splice()mmap()

我使用我们自己的伪字幕设备文件的描述符调用mmap(),例如' / dev / mem'。

使用我们自己的伪字符设备文件调用mmap()时,在mmap注册的file_operation函数指针内部,我们可以调用remap_pfn_range()来映射内存..

现在该进程可能已终止/终止/清除exit()。 如何从内核空间中删除这些映射。我正在研究ARMv7-A。

有人可以解释当进程被终止/终止时这些内存映射会发生什么吗?内核是单独删除映射还是我们需要unmap显式?

2 个答案:

答案 0 :(得分:2)

您可以在最后一次复制退出时通过release处理。

struct file_operations {
  ...
  int (*release) (struct inode *, struct file *);
  ...
}

来自LDD

  

在释放文件结构时调用此操作。   像open一样,发布可能会丢失。[注意,不会调用发行版   每次进程调用close。每当共享文件结构时   (例如,在fork或dup之后),释放不会被调用,直到   所有副本都已关闭。如果需要在任何副本时刷新挂起数据   关闭后,你应该实现flush方法。

答案 1 :(得分:1)

mmap将外部(进程)内存空间映射到调用它的进程的虚拟地址空间。内存可能是一个共享内存段,一个文件......与它映射到的物理内存段不同,mmap只是创建一个"链接"到该段,并返回一个可以从调用进程中查看和使用的地址。

mmap调用进程终止(自然地,已杀死..)时,它创建的映射会自动取消映射。

然而,映射的物理内存区域可以被其他进程使用(或者不使用),仍然可用。

man mmap

您可以在程序死亡之前关闭该程序的映射,

int munmap(void *addr, size_t length);