시스템 호출에 uid_t
또는 int
(파일 설명자용) unsigned int
과 같은 일부 32비트 매개변수 또는 일부 16비트 유형이 필요한 경우 64비트 레지스터를 사용하여 이를 어떻게 전달할 수 있습니까?
이 명령어를 사용하기 전에 64비트로 0 확장 또는 부호 확장이 필요합니까 syscall
?
원래 64비트 포인터 유형 매개변수가 32비트가 되도록 RAX를 사용하는 경우 __X32_SYSCALL_BIT
동일한 64비트 레지스터를 사용하여 매개변수를 전달해야 합니다. 이 경우 주소 매개변수를 0 확장해야 합니까?
답변1
이를 0 확장해야 하지만 x86-64에서 32비트 값의 일반적인 경우에는 고려할 필요가 없습니다. 32비트 레지스터에 값을 저장하면 해당 64비트 레지스터가 0 확장됩니다. (즉, movl $4, %edx
4를 )에 저장합니다 rdx
. 8비트 및 16비트 값은 명시적으로 0 확장되어야 합니다( movzbl
또는 movzwl
8비트 또는 16비트 레지스터에서 32비트 레지스터로 64비트로 암시적으로 0 확장됨).
실제로 포인터가 아닌 경우 시스템 호출 구현은 하위 수준만 읽습니다.N그럼에도 불구하고 적어도 32비트 값에서는 실제 차이를 볼 수 없습니다. (예를 들어SYS_read
처음 32비트에서 가비지를 호출하면 RDI
오류가 발생하지 않으며 하위 32비트만 고려됩니다. ) __X32_SYSCALL_BIT
포인터의 처음 32비트를 지우지 않고 설정하면 어떻게 되는지 확인하지 않았습니다 .