我正在开发一个Linux内核模块,它通过syscall mmap与用户应用程序共享一块内存。 该模块可以在struct file_operations中定义的mmapcallback的帮助下正常工作,这会在系统调用被调用时通知模块。
但是,当用户应用程序想要通过syscall munmap停止共享时,问题就出现了。 没有munmapcallback或在struct file_operations中执行类似工作的东西。 因此,我必须做另一个ioctl来通知内核模块共享已被吊销,这既不方便也不安全。
在search解决scheme期间,我发现曾经有一个munmapcallback被定义。 但是当内核版本大约是2.4或者之后,它被删除了。
有人可以告诉我为什么munmapcallback被删除,或有任何其他的方法来通知内核模块时,系统调用munmap?
经过一番探索,我终于找到了答案。
我需要的功能在于vm_operations_struct。 如果munmap()系统调用成功执行,关闭回调将被调用,我可以使用这个函数指针来通知我的内核模块一个内存unmap刚刚发生。
默认关闭操作(即关闭函数指针的分配)的重写是在我的内核模块的mmap处理程序中完成的,其中提供了一个vm_area结构作为参数,您可以执行所有您想要的操作。
实际上,所有的细节都在“Linux设备驱动程序3”第15章中描述。
感谢所有你们提供真正有用的建议。
munmap()
不是文件操作,它是在映射的内存本身上运行的系统调用。
mmap()
文件描述符是完全有效的,然后关闭文件描述符。