将内核内存映射到用户空间有多种方法。
有人说使用splice()
,mmap()
等
我使用我们自己的伪字幕设备文件的描述符调用mmap()
,例如' / dev / mem'。
使用我们自己的伪字符设备文件调用mmap()
时,在mmap注册的file_operation
函数指针内部,我们可以调用remap_pfn_range()
来映射内存..
现在该进程可能已终止/终止/清除exit()。 如何从内核空间中删除这些映射。我正在研究ARMv7-A。
有人可以解释当进程被终止/终止时这些内存映射会发生什么吗?内核是单独删除映射还是我们需要unmap
显式?
答案 0 :(得分:2)
您可以在最后一次复制退出时通过release
处理。
struct file_operations {
...
int (*release) (struct inode *, struct file *);
...
}
来自LDD
在释放文件结构时调用此操作。 像open一样,发布可能会丢失。[注意,不会调用发行版 每次进程调用close。每当共享文件结构时 (例如,在fork或dup之后),释放不会被调用,直到 所有副本都已关闭。如果需要在任何副本时刷新挂起数据 关闭后,你应该实现flush方法。
答案 1 :(得分:1)
mmap
将外部(进程)内存空间映射到调用它的进程的虚拟地址空间。内存可能是一个共享内存段,一个文件......与它映射到的物理内存段不同,mmap
只是创建一个"链接"到该段,并返回一个可以从调用进程中查看和使用的地址。
当mmap
调用进程终止(自然地,已杀死..)时,它创建的映射会自动取消映射。
然而,映射的物理内存区域可以被其他进程使用(或者不使用),仍然可用。
您可以在程序死亡之前关闭该程序的映射,
int munmap(void *addr, size_t length);