2011-09-11 2 views
0

execve (x86_64 Linux에서)의 구현을 어떻게 볼 수 있습니까? 라이브러리 unistd에 있습니까? execve를 호출하지 않고 어셈블러를 사용하여 외부 프로그램을 호출하는 방법을 알고 싶기 때문에 이걸 원합니다. execve라는 시스템 호출이 있다는 것을 알고 있지만, 어떻게 사용할 수 있는지 모르겠습니다.함수의 구현 execve (unistd.h)

변수 char * 및 유형 char * []를 레지스터에 넣을 수 있습니까?

int execve(const char *filename, char * const argv[], char * const envp[]) { 
    return syscall(SYS_execve, filename, argv, envp); 
} 

실제 "작업"의 모든

커널에서 수행됩니다

답변

1

사용자 공간에서 execve() 기능의 구현은 같이 보입니다. 아마도 스레딩 정리 외에 libc에서 특히 흥미로운 일은 없습니다.

+0

감사합니다. 그러나 char * 유형의 변수를 입력하고 char * [] 유형을 레지스터에 넣을 수 있습니까? 예를 들어, 필자가 시스템 콜을 쓸 때만 쓰기 및 종료하는 방법을 알고 있습니다. 포인터를 레지스터에 넣고 버퍼 크기를 다른 포인터에 넣어야하지만 어떻게 할 수 있습니까? – dv1729

+0

이전과 다른 점이 없습니다 - 파일 이름, 인수 배열 및 환경 배열에 대한 포인터를 세 개의 레지스터에 넣습니다. 후자의 2 개는'char *'의 배열의 선두에의 포인터가되어, NULL로 끝난다. – duskwuff

0

glibc의 소스 코드에는 시스템 호출을 실제로 구현할 수 없습니다. 시스템 호출 번호를 정의하는 다양한 파일에서 빌드 타임에 생성됩니다. 당신이 실제 시스템 호출 번호를 제외하고, 그것을 이해한다면

관련 정보

sysdep.h에서 찾을 수있다 (당신이 __NR_execve, IIRC, #include <asm/unistd.h>을 원한다 - 나는 그것이 x86_64의가 뭔지 즉석 회수 할 수 없습니다).

시스템 호출 번호는 % rax에 있으며 인수는 % rdi % rsi % rdx에 있습니다. 이 모든 정보 (스택 정렬 및 커널에 의한 레지스터 사용에 대한 정보 포함)는 sysdep.h에서 주석 처리됩니다.

1

아키텍처에 대한 시스템 호출 규칙 (syscall 번호 및 매개 변수에 대한 레지스터 및/또는 스택)에 대한 커널 소스 (특히 : arch/YOUR-ARCH/kernel/head * .S)).

예를 들어 ARM에서는 __NR_execve을 r7에로드하고 인수를 r0, r1, r2에로드 한 다음 swi 0을 사용합니다. 자세한 내용은 this explantion of ARM EABI syscalls에 관심이있을 수 있습니다.