我正在使用Linux内核模块,该模块通过syscall mmap与用户应用程序共享一块内存。该模块可以在struct file_operations中定义的mmap回调的帮助下正常工作,该回调在调用syscall时通知模块。
然而,当用户应用程序想要通过系统调用munmap停止共享时,问题就出现了。没有munmap回调或在struct file_operations中执行类似工作的东西。因此,我必须做另一个ioctl来通知内核模块共享已被撤销,这既不方便又不安全。
在我搜索解决方案期间,我发现曾经有一个munmap回调被定义。但是当内核版本大约是2.4或者之后的某些时候它被删除了。
有人可以告诉我为什么删除了munmap回调,或者在调用munmap系统调用时是否有任何替代方法来通知内核模块?
答案 0 :(得分:4)
经过一番搜索,我终于找到了答案。
我需要的功能在于vm_operations_struct。如果munmap()系统调用成功执行,将调用close回调,我可以使用此函数指针通知我的内核模块刚刚发生的内存unmap。
默认关闭操作的覆盖,即close函数指针的赋值,在我的内核模块中的mmap处理程序中完成,其中vm_area结构作为参数提供,你可以做所有的事情你想要它。
实际上,所有细节都在Book Linux Device Drivers 3,Chapter 15中进行了描述。
感谢所有人提供真正有用的建议。
答案 1 :(得分:1)
munmap()
不是文件操作,它是对映射内存本身进行操作的系统调用。
mmap()
文件描述符完全有效,然后关闭文件描述符。