시스템 호출 등록 및 순서가 Intel 32비트에서 64비트로 변경된 이유는 무엇입니까?

시스템 호출 등록 및 순서가 Intel 32비트에서 64비트로 변경된 이유는 무엇입니까?

이를 더 쉽게 식별할 수 있도록 Linux 시스템 호출 순서를 기억하려고 합니다. 그러다가 내가 찾았어논문은 여기 있어요,그것은 말한다,

32비트 Linux에서 시스템 호출을 수행하려면 시스템 호출 번호를 에 입력하고 해당 매개변수를 , , , , eax순서대로 입력 한 다음 int 0x80을 호출합니다.ebxecxedxesiediebp

그런 다음,

64비트 Linux에서 시스템 호출을 수행하려면 시스템 호출 번호를 , , , 순서로 입력 한 다음 해당 rax매개변수를 입력 하고 syscall 을 호출합니다.rdirsirdxr10r8r9

64비트와 32비트 사이의 순서가 왜 그렇게 혼란스럽습니까? 나는 이 질문이 기술적이라기보다는 역사적일 수 있다는 것을 알고 있습니다.

이것은 전적으로 커널에 의해 결정됩니까? 새로운 규칙을 지지하는 기술적인 이유가 있나요?

답변1

이는 커널에 크게 의존하지만 64비트 x86에서 선택한 호출 규칙을 사용하는 데에는 이유가 있습니다. 선택한 사용자 공간 규칙과 일치하기 때문입니다. Linux에서 사용되는 System V x86-64 ABI,지정하다이 함수는 레지스터 %rdi, %rsi, %rdx, %rcx및를 사용하여 매개변수 %r8%r9전달합니다. 시스템 호출 규칙은 이것과 매우 유사합니다. 유일한 차이점은 %r10대신 을 사용한다는 것입니다 %rcx. 주로 SYSCALL시스템 호출을 호출하는 데 사용되는 새로운 64비트 명령어가 %rcx다른 목적에 필요하기 때문입니다.

답변2

컴파일된 코드의 등록 순서는 코드 빌드 및 디버깅을 용이하게 하기 위한 Linux 호출 규칙입니다.

AMD-64 아키텍처에는 32비트 아키텍처보다 더 많은 레지스터가 있으며 새로운 호출 규칙을 사용하여 다른 레지스터를 확보하여 코드를 더 잘 최적화합니다.

두 아키텍처 간의 코드를 분해하면 amd-64에서 함수의 로컬 정수 변수를 대체하는 더 많은 레지스터를 볼 수 있다는 점도 알 수 있습니다. 내가 정확하게 기억한다면, rebp는 함수에서 반환되기 전에 지역 변수 스택을 사용하여 생성된 코드를 최적화하는 데 사용됩니다.

관련 정보