Linux i386에서 int $0x80
syscall ABI를 사용하면 유효한 사용자 공간 스택 없이도 syscall을 쉽게 수행 할 수 있습니다. 반면에 vdso/vsyscall 인터페이스는 스택에 액세스해야합니다. 이와 관련하여 다른 Linux 포트, 특히 x86_64는 어떻게됩니까? 그들은 스택없이 syscalls를 만드는 방법이 있습니까? 각 아치에 대해 사용 가능한 syscall 메소드에 대한 참조가 있습니까?스택이없는 Linux에서 syscalls 만들기
3
A
답변
4
일반적으로 알 수 있습니다. i386에서도 6 번째 인수가 있으면 스택에 전달해야합니다 (예 : mmap
). x86_64에 들어
특히 (주의 : 시스템 콜 번호는 32 비트들로 완전히 다르게 할당) %rax
에서 콜 번호를 넣어 6 개 %rdi
의 인수 %rsi
, %rdx
, %r10
, %r8
및 %r9
까지 (어느 레지스터에 전달되는 매개 변수의 일반적인 ABI와 거의 비슷하지만 거의 동일하지 않습니다. %rcx
대신 %r10
을 사용하십시오.) syscall
명령어를 사용하십시오. 결과는 %rax
으로 반환되고 %rcx
및 %r11
은 clobbered됩니다.
86_64 ABI 정보는 http://www.x86-64.org/documentation/abi.pdf에 있습니다. Linux ABI는 부록에 설명되어 있습니다. (주변에 다른 곳에서 x86_64의 ABI의 정보를 찾고 있다면, 64 비트 Windows가 자신의 다른 ABI 사용에 유의하십시오.) 나는 syscall
가 작동하려면 사용자 스택 프레임에 대한 모든 요구 사항이 믿지 않는
정확히. 시그널에 의해 인터럽트되는 경우, 핸들러에는 분명히 정상적인 스택이 필요합니다. 그러나 의도적으로 다른 신호 스택을 사용하여 다음과 같은 실험은 syscall
주위 %rsp
이 나를 위해 잘 작동 삭제 한 사용자 :
$ cat syscall_sig.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#define __NR_nanosleep 35
static sig_atomic_t alrm = 0;
void handler(int sig)
{
if (sig == SIGALRM)
alrm = 1;
}
int main(void)
{
stack_t ss;
struct sigaction sa;
struct timespec req, rem;
long ret;
ss.ss_flags = 0;
ss.ss_size = SIGSTKSZ;
ss.ss_sp = malloc(ss.ss_size);
sigaltstack(&ss, NULL);
memset(&sa, 0, sizeof(sa));
sa.sa_handler = handler;
sa.sa_flags = SA_ONSTACK;
sigaction(SIGALRM, &sa, NULL);
alarm(1);
req.tv_sec = 5;
req.tv_nsec = 0;
asm("xorq $0x12345678, %%rsp ; syscall ; xorq $0x12345678, %%rsp"
: "=a" (ret)
: "0" (__NR_nanosleep), "D" (&req), "S" (&rem)
: "rcx", "r11", "memory");
printf("syscall return code %ld, alarm flag %d\n", ret, alrm);
return 0;
}
$ gcc -Wall -o syscall_sig syscall_sig.c
$ ./syscall_sig
syscall return code -4, alarm flag 1
$
관련 문제
- 1. 스택이없는 부울 식 처리?
- 2. Linux에서 AppleDouble 형식의 파일 만들기
- 3. MIPS Syscalls 및 $ t 레지스터
- 4. Windows의 사용자 공간에서 syscalls 연결
- 5. Linux에서 숨겨진 Windows 파일/폴더 만들기
- 6. C에서 재귀 및 스택이없는 트래버스 트리
- 7. 시스템에 다른로드가없는 syscalls 차단 (Linux 커널)
- 8. 커널 컴파일 중`missing-syscalls '오류가 발생했습니다
- 9. 파이썬에서 하나의 스레드에서 여러 개의 select() syscalls
- 10. Linux에서 Qt를 사용하여 Windows 용 실행 파일 만들기
- 11. Linux에서 서버를 재부팅 할 수있는 PHP 웹 페이지 만들기?
- 12. 유용한 호출 스택이없는 재생산하기 어려운 크래시를 어떻게 디버깅합니까?
- 13. 스택이없는 파이썬에서 채널을 통해 채널을 보낼 수 있습니까?
- 14. Linux에서 GetTcpTable이 동일합니다.
- 15. Linux에서 실행중인 프로그램의 디렉토리?
- 16. Linux에서 화면 캡처
- 17. Linux에서 VHDL 프로그래밍?
- 18. Linux에서 설치 패키지 개발
- 19. Linux에서 공유 라이브러리 수정
- 20. Linux에서 작동하는보고 솔루션이 있습니까?
- 21. Linux에서 SIGSEGV를 처리 하시겠습니까?
- 22. Linux에서 netstat 형식 질문
- 23. Linux에서 Windows C++ 포트
- 24. Linux에서 virtualenv에 wxPython 설치
- 25. linux에서 : FIFO에 쓰기
- 26. Z-Linux에서 BlazeDS 지원
- 27. Linux에서 iOS 에뮬레이트/시뮬레이션
- 28. Linux에서 libdbodbc.so를 Sybase에 위치
- 29. Linux에서 Powerpoint를 Flash로 변환
- 30. Linux에서 Java Runtime.exec 비애
이 내가 간접적으로 내가 직접 액세스 할 수 없기 때문에 다른 사람을 통해 (뭘하는지입니다 포팅을 위해 x86_64 시스템으로). 사실 지금은 스택이 있지만 나중에 알 수없는 상황을 처리해야하지만 이미 문제가 있습니다. 당신이 기술 한 방법은 시그널에 의해 syscall이 인터럽트되지 않는 한 작동하지만 인터럽트되어 재개하려고하면'syscall' 명령으로 segfault됩니다 ...'syscall'은 특정 스택 프레임이 얻어 지도록 설정해야합니까 중단/재개? –
내가 아는 한 멀지 않았다. 편집을 참조하십시오 ... –
시그널 핸들러에 섀도우 스택이 없다면, 메인 스택을 사용합니다. – Joshua