반응형
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. */
이제 제 질문은 다음과 같습니다.
- 이스
syscall
(이전에)cmpq
지시) 지시? - 만약 그것이 지시라면, 무엇의 의미가 있습니까?
ENTRY (syscall)
? ENTERT(ENTRY가 무엇인지 모르겠습니다)와 명령의 이름이 같습니까? - 뭐가
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의 명령어입니다.비슷한 지침이 있습니다.sysenter
i686에.
ENTRY(syscall)
매크로가 될 겁니다.기호 정의로 확장될 수도 있고, 이를 위해서는 그랩을 해야 합니다.
언급URL : https://stackoverflow.com/questions/10583891/is-syscall-an-instruction-on-x86-64
반응형
'programing' 카테고리의 다른 글
lodash를 사용하여 들쭉날쭉한 배열 비교(주문 없이 품목 존재) (0) | 2023.10.30 |
---|---|
Oracle 종속성 없이 Java에서 Oracle Refurser (0) | 2023.10.30 |
Oracle SQL 개발자:피봇 함수를 사용하여 행을 열로 변환하는 방법 (0) | 2023.10.30 |
ALTER TABLE 제약 조건 (0) | 2023.10.30 |
MariaDB Galera 클러스터에서 데이터 캡처 변경 (0) | 2023.10.30 |