x86_64에서 Linux 시스템 호출에 32비트 인수를 어떻게 전달해야 합니까?

x86_64에서 Linux 시스템 호출에 32비트 인수를 어떻게 전달해야 합니까?

시스템 호출에 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, %edx4를 )에 저장합니다 rdx. 8비트 및 16비트 값은 명시적으로 0 확장되어야 합니다( movzbl또는 movzwl8비트 또는 16비트 레지스터에서 32비트 레지스터로 64비트로 암시적으로 0 확장됨).

실제로 포인터가 아닌 경우 시스템 호출 구현은 하위 수준만 읽습니다.N그럼에도 불구하고 적어도 32비트 값에서는 실제 차이를 볼 수 없습니다. (예를 들어SYS_read처음 32비트에서 가비지를 호출하면 RDI오류가 발생하지 않으며 하위 32비트만 고려됩니다. ) __X32_SYSCALL_BIT포인터의 처음 32비트를 지우지 않고 설정하면 어떻게 되는지 확인하지 않았습니다 .

관련 정보