runtime state를 저장할 수 있는 리눅스 커널 패치가 있다고 들었는데, 이것과 연관있는거 같아요.
좋은 정보 감사합니다.
사실 제가 만들려는 건 커널소스를 수정하지 않고, 메모리 스냅샷을 찍는 거거든요.
메모리 스냅샷은 스냅샷용 라이브러리를 민든 후, 직접 돌리고자 하는 프로그램의 소스코드에서 이 라이브러리를 call해서 스스로 스냅샷을 찍게 하는 방식으로 하면 가능할거 같아요.
프로그램상의 레지스터 값들, 스택 및 heap 값들도 모두 저장 가능할거 같고요.
그런데 문제는, 스냅샷을 재개할 때, 똑같은 프로그램을 그대로 돌리는게 아니라 바이너리의 GOT, PLT를 약간 수정해야 할 일이 있어요. GOT와 PLT를 수정할 수 있는 어떤 좋은 프로그래밍 라이브러리/툴을 찾고 있는 중인데 혹시 없을지...
https://lwn.net/Articles
https://lwn.net/Articles/478111/
LXC 등의 container 에서 사용할 수 있도록 최근까지 진화된 것이 CRIU 입니다.
전부터 소문으로 들어왔던 게 이거였군요
runtime state를 저장할 수 있는 리눅스 커널 패치가 있다고 들었는데, 이것과 연관있는거 같아요.
좋은 정보 감사합니다.
사실 제가 만들려는 건 커널소스를 수정하지 않고, 메모리 스냅샷을 찍는 거거든요.
메모리 스냅샷은 스냅샷용 라이브러리를 민든 후, 직접 돌리고자 하는 프로그램의 소스코드에서 이 라이브러리를 call해서 스스로 스냅샷을 찍게 하는 방식으로 하면 가능할거 같아요.
프로그램상의 레지스터 값들, 스택 및 heap 값들도 모두 저장 가능할거 같고요.
그런데 문제는, 스냅샷을 재개할 때, 똑같은 프로그램을 그대로 돌리는게 아니라 바이너리의 GOT, PLT를 약간 수정해야 할 일이 있어요. GOT와 PLT를 수정할 수 있는 어떤 좋은 프로그래밍 라이브러리/툴을 찾고 있는 중인데 혹시 없을지...
라이브러리는 없습니다만 그런 프로그램이 이미 있기는
라이브러리는 없습니다만 그런 프로그램이 이미 있기는 합니다. gdb 요.
https://sourceware.org/gdb/onlinedocs/gdb/Checkpoint_002fRestart.html
덧.
아예 gcore 라는 유틸도 제공됩니다.
elf 툴 라이브러리는 몇 가지 있는거 같습니다
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
https://sourceforge.net/projects/elftoolchain/
단 gdb같이 runtime 용으로 쓰는 건 아니고 정적 elf 파일을 분석하고 수정하는 용도가 대부분인듯 합니다.
코드, 테이블, 스택, heap의 저장방법은 스택포인터, 힙포인터, 코드포인터 등을 기준으로 메모리를 탐색해서 해당 구역을 저장하는 라이브러리를 제작하면 가능할 거 같습니다. 단 해당 라이브러리를 타겟 프로그램 안에서 call해야만 스냅샷 저장이 가능하지만요.
댓글 달기