프로세스를 RAM에 로드했지만 실행되지 않습니까?

프로세스를 RAM에 로드했지만 실행되지 않습니까?

프로세스를 RAM에 로드하지만 스케줄러에게 프로세스를 실행하지 않도록 지시하는 방법이 있습니까? 목적은 시스템이 디스크에서 바이너리 파일을 읽고 코드에 대해 RAM에 페이지를 할당하지만 즉시 코드로 점프하여 실행을 시작하지 않도록 하는 것입니다. 나중에 다시 시작할 계획입니다.

다음은 이와 비슷하지만 신호를 전달하여 프로세스를 일시 중지하기 전에 일정량의 작업을 수행할 수 있습니다.

$ /path/to/program &; kill -STOP $!

코드 실행의 일부에는 실제 프로그램의 첫 번째 줄을 실행하기 전에 라이브러리 및 기타 "설정"을 가져오는 것이 포함된다고 가정합니다. 이 단계가 실행되는지 여부는 중요하지 않습니다. 나에게 루트 권한이 있고 이 작업을 지원하기 위해 시스템을 변경할 수 있다고 가정할 수 있습니다.

그것을 가지고 놀고 난 후에 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

셸에서 실행하면 실제로 프로세스가 백그라운드로 전환되고 fg.

관련 정보