programing

x86_64의 명령어가 syscall입니까?

cafebook 2023. 10. 30. 21:15
반응형

x86_64의 명령어가 syscall입니까?

glibc에서 시스템 호출을 수행하는 코드를 확인하고 싶었습니다.이런 걸 찾았어요

ENTRY (syscall)
    movq %rdi, %rax     /* Syscall number -> rax.  */
    movq %rsi, %rdi     /* shift arg1 - arg5.  */
    movq %rdx, %rsi
    movq %rcx, %rdx
    movq %r8, %r10
    movq %r9, %r8
    movq 8(%rsp),%r9    /* arg6 is on the stack.  */
    syscall         /* Do the system call.  */
    cmpq $-4095, %rax   /* Check %rax for error.  */
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error.  */
L(pseudo_end):
    ret         /* Return to caller.  */

이제 제 질문은 다음과 같습니다.

  1. 이스syscall(이전에)cmpq지시) 지시?
  2. 만약 그것이 지시라면, 무엇의 의미가 있습니까?ENTRY (syscall)? ENTERT(ENTRY가 무엇인지 모르겠습니다)와 명령의 이름이 같습니까?
  3. 뭐가L(pseudo_end)?

syscall 는 x86-64 의 명령어이며, 시스템 호출을 위한 ABI 의 일부로 사용됩니다. (32비트 ABI 는int 80h아니면sysenter, 64비트 모드에서도 사용할 수 있지만, 64비트 코드의 32비트 ABI를 사용하는 것은 특히 포인터 인수가 있는 호출의 경우 좋지 않은 생각입니다.)

그러나 시스템 호출 ABI의 일반 래퍼인 C 라이브러리 함수도 있습니다.당신의 코드는 그 함수의 덤프를 보여줍니다. 여기에는 반환 값을 다음과 같이 디코딩하는 것도 포함됩니다.errno-설정.ENTRY(syscall)함수가 거기서 시작된다는 뜻입니다.

L()그리고.ENTRY()CPP 매크로입니다.

L(pseudo_end)단지 점프 대상이 될 수 있는 라벨일 뿐입니다.아마도 코드는SYSCALL_ERROR_LABEL다시 거기로 뛰어오릅니다. 비록 그 코드 블록이 그냥 하는 것이 더 효율적이겠지만.ret, 이전 버전의 유물이거나 다른 용도로 사용되었을 수도 있습니다.

네.syscall는 x86-64의 명령어입니다.비슷한 지침이 있습니다.sysenteri686에.

ENTRY(syscall)매크로가 될 겁니다.기호 정의로 확장될 수도 있고, 이를 위해서는 그랩을 해야 합니다.

언급URL : https://stackoverflow.com/questions/10583891/is-syscall-an-instruction-on-x86-64

반응형