有没有办法将进程加载到 RAM 中,但以某种方式告诉调度程序不要执行它?目的是让系统从磁盘读取二进制文件,为代码分配 RAM 中的页面,但不会立即跳转到代码中开始执行。打算稍后再开始。
下面的内容与此近似,但允许在传递信号以暂停进程之前执行一定量的操作:
$ /path/to/program &; kill -STOP $!
我假设代码执行的某些部分涉及在执行实际程序的第一行之前引入库和其他“设置”。我不介意这些步骤是否运行。我们可以假设我拥有 root 权限,并且可以对系统进行任何更改以支持此任务。
玩过之后gdb
,我认为这可以以某种方式满足我的要求。这就足够了,但理想情况下,我有一种方法可以做到这一点,而不需要让任何东西与我的流程一起运行。
针对评论,我怀疑按需加载问题确实会挫败该计划。我希望将代码加载到 RAM 中,修改文件,然后让进程执行。 RAM 中的代码现在与磁盘上的代码不同。如果进程的第一个工作是对文件进行哈希处理,那么即使它正在运行“正确”的代码,它现在也会得到“错误”的哈希值。
答案1
这可能不会达到你的目的真的之后(如评论中所述,二进制文件根据需要加载),但它会在进程启动后立即停止,并让它等待SIGCONT
.
将以下内容放入文件中,例如stop.c
:
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
__attribute__ ((constructor)) void stoponstart() {
kill(getpid(), SIGSTOP);
}
将其构建为共享库:
gcc stop.c -o stop.so -fPIC -shared
然后每当您想要“启动和暂停”程序时预加载它:
LD_PRELOAD=/path/to/stop.so foo
当从 shell 运行时,这实际上会将进程置于后台,然后您可以使用 来真正启动它fg
。