英文:
When is the release system call called?
问题
我正在编写一个设备驱动程序,其中我希望mmap系统调用引用我的驱动程序的一个函数,该函数已注册为文件操作。然后,我希望release系统调用引用另一个已注册为vm_operations_struct的函数。当使用这些系统调用的用户级程序退出或在运行时被终止时,我注意到释放函数会自动调用,而我没有编写相应的代码。我的问题是,释放系统调用是否实际上会在程序返回或崩溃时自动调用,以及是否有一种方法可以在代码中自己调用释放系统调用?
英文:
I am writing a device driver in which I have the mmap system call refer to a function of my driver, which is registered as a file operation. Then I have the release system call refer to another function, registered as vm_operations_struct. When my user level program which uses those system calls exits or is killed while running I see that the release function is called automatically, with no code written. My question is whether the release system call is called actually automatically when the program returns or crashes and is there a way to call the release system call myself in the code?
答案1
得分: 2
是的,每当一个进程终止时,无论是正常终止(通过_exit
系统调用)还是被信号终止,内核会自动释放该进程持有的所有资源。在Linux中,我相信您可以查看do_exit
函数的代码,了解这是如何实现的。
没有"release"系统调用,但是假设您已经正确连接了所有内容,我期望当程序使用munmap
来撤销由您的驱动支持的内存映射,和/或者当它使用close
关闭由您的驱动支持的文件描述符时,您的驱动程序的释放函数也会被调用。
英文:
Yes, whenever a process terminates, either normally (via the _exit
system call) or by the action of a signal, the kernel automatically releases all resources held by that process. For Linux I believe you can look at the code of do_exit
to see how this is done.
There is no "release" system call, but assuming you have wired everything up correctly, I would expect that your driver's release function will also be called when the program uses munmap
to tear down memory mappings backed by your driver, and/or when it uses close
to close file descriptors backed by your driver.
答案2
得分: 1
以下是翻译好的内容:
确实,在内核中,每当最后一个具有对由mmap
返回的内存区域的引用的用户级进程或线程退出或使用munmap
系统调用明确取消映射内存区域时,vm_operations_struct
中的释放函数会自动被调用。
在mmap
调用期间分配的资源,如物理内存或设备寄存器,必须使用释放函数来释放。在取消映射内存区域之前,内核会调用此函数,以便驱动程序有时间对其资源进行碎片整理。
可以使用作为释放函数参数传递的vm_area_struct
结构来明确从驱动程序代码内部调用该函数。释放函数设计为只能在内核确定可以安全释放与内存区域相关的资源时才被调用,因此通常不建议这样做。自行释放可能导致意外行为甚至系统崩溃。
如果需要在用户级程序崩溃或退出时执行清理任务,请考虑安装SIGINT
或SIGTERM
信号处理程序,或使用atexit
函数注册退出处理程序。这些机制使您能够在用户终止或终止程序之前执行清理操作。
英文:
It is true that the release function in the vm_operations_struct
is automatically called by the kernel whenever the last user-level process or thread that has a reference to the memory region returned by mmap
exits or the memory region is specifically unmapped using the munmap
system call.
A resource that was allocated during an mmap
call, such as physical memory or device registers, must be released using the release function. Before the memory region is unmapped, the kernel calls this function to give the driver time to defragment its resources.
The vm_area_struct
structure, which is passed as an argument to the release function, can be used to explicitly call the function from within your driver code. The release function is designed to only be called by the kernel when it is safe to release resources related to the memory region, so doing so is typically not advised. Self-releasing could result in unexpected behavior and even a system crash.
Consider installing a SIGINT
or SIGTERM
signal handler or registering an exit handler using the atexit
function if you need to perform cleanup tasks when your user-level program crashes or exits. These mechanisms enable you to carry out cleanup actions prior to the user killing or terminating your program.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论