如何卸载包含该进程的可执行文件的块设备?

问题描述 投票:0回答:1

在嵌入式Linux中,内存是宝贵的。就我而言,我在tmpfs ram-disk中有一个可执行文件。实际上,ram-disk只包含一个文件,即可执行文件。

我想只运行一次可执行文件。该可执行文件在很长一段时间内运行。当它运行时,我想卸载ram-disk,释放一些内存。因此我删除了可执行文件,然后卸载了ram-disk。它只显示设备忙碌错误消息:umount失败。

我怎样才能做到这一点?我不是在谈论Lazy umount。我想要一个真正的卸载,释放内存!应该可以,因为正在运行的进程已经将其图像加载到RAM中。它不应该依赖于ram-disk文件系统。

如果现在一般的Linux内核不可能,我欢迎回答指向我可以破解内核以启用此功能的地方。

如果可能,以编程方式回答是首选。虽然脚本方式的答案也是受欢迎的(我可以通过查看shell脚本源代码将脚本转换为某些可执行文件)。

我的内核版本是3.10.14

- 更新 - 另一个想法:我的目的是释放一些内存,因为我的应用程序是内存占用。与总RAM相比,二进制大小也很大。我原来的想法是,ramdisk有一个文件的副本,而运行的图像是另一个副本。但也许Linux只保留一份而不是两份?任何人都知道如何在文件系统和正在运行的映像中保存elf可执行文件? Linux只保留一份副本,或者某些元数据+ 1份副本,真的不保留2份副本吗?如果这是真的,我不需要卸载。

linux linux-kernel
1个回答
0
投票

应该可以,因为正在运行的进程已经将其图像加载到RAM中。

这是不可能的。

如果系统处于内存压力下,则可以分页出可执行映像的未使用文本页面。内核不是将这些页面写入交换,而是通过从核心中删除它们来“交换”这些页面,并了解如果需要它们可以从磁盘读回。

因此,您无法卸载包含正在使用的可执行代码的文件系统。这不是特定于可执行二进制文件;它也适用于图书馆。

© www.soinside.com 2019 - 2024. All rights reserved.