2012-08-08 2 views
3

저는 C++에서 리눅스 플랫폼을위한 프로세스 로더를 만들고 있습니다; 그것은 레크리에이션 프로젝트 일뿐입니다. 기본적으로 실행 파일의 모든 섹션을 메모리에 수동으로로드 한 다음 실행하고 싶습니다.C++의 Linux 프로세스 로더

관련 질문이지만 좀 더 구체적인 질문이 있습니다. here 약 일주일 전. 그러나 더 많은 독서를 한 후에 실제로 프로세스를 만드는 방법을 배우기 전까지는 메모리 매핑이 부적절하다는 것을 알게되었습니다. 그래서 내 질문은, 거기에 자신의 가상 주소 공간 (코드 및 데이터를로드 할 액세스 할 수있을 것입니다)와 리눅스에서 "빈"새로운 프로세스를 만드는 방법은 무엇입니까?

프로세스 로더 개발에 대한 일반적인 리소스조차도 유용 할 것입니다. 왜냐하면 아직 찾을 필요가 없기 때문입니다.

답변

3

당신이 exec() 뭔가를 요청할 때 리눅스 프로세스 로더가 정말 무대 뒤에서 무엇을하는지보고 관심이 있다면, 커널 소스의 사본을 잡고 do_execve_common()에 대한 내부 fs/exec.c 찾습니다.

ELF 처리기 자체는 ELF 바이너리를 실행하려고하면 호출되며 결국 fs/binfmt_elf.c에 있습니다. 특히 load_elf_binary()은 디스크에서 프로세스 이미지를로드하는 데 필요한 정보가 들어있는 struct linux_binprm이있는 실제로드를 수행합니다.

Linux가 지원하는 이진 형식에 대해 binfmt_*.c 개의 파일이 많이 있음을 확인하십시오. 사용자 정의 이진 형식을 사용하는 경우 일 수 있으며, 원칙적으로 직접 작성하여 커널 모듈로 제공하십시오. 프로세스 로딩의 내부는 사용자 모드 코드에 불투명합니다 (정당한 경우 : 심각한 보안 허점이 존재하지 않을 경우 존재할 것입니다).

1

fork() 함수를 사용하여 부모 프로세스의 복제본을 만드는 새 프로세스를 만든 다음 exec 패밀리 함수 중 하나를 사용하여 실행 파일을로드하고 실행할 수 있습니다.

+0

그래도 프로세스 가상 공간이 비어 있어야합니다. 새 프로세스가 이전 프로세스의 복제본이면 작동하지 않습니다. 로더와 실행 파일은 로딩이 완료되면 서로 독립적이어야합니다. – nosuchthingasstars

+0

@nosuchthingasstars 이것은 유닉스 계열의 운영체제가 작동하는 방식입니다. exec 함수는 슬레이트를 깨끗하게 지우지 만 대상 실행 파일로 자동 채 웁니다. 동적 라이브러리 링커 기능을 대체 할 수 있지만 커널은 기본 정적로드를 수행합니다. –

+0

@ChrisStratton로드하는 실행 파일은 ELF가 아닙니다. 그래서 수동으로 섹션을로드해야합니다. – nosuchthingasstars

관련 문제