MS-DOS 이후로 인터럽트를 사용하는 시스템 호출을 알고 있습니다. 예전의 문서에서는 리눅스에서 시스템 기능을 호출하기 위해 int 80h
에 대한 참조를 보았습니다. 오랜 시간이 걸린 지금부터 syscall
명령어를 사용하여 int 80h
을 사용하지 않습니다. 하지만 내 32 비트 컴퓨터에서 작동시키지 못합니다.32 비트 시스템의 Syscall 또는 sysenter Linux?
질문
는 64 비트 플랫폼에서 사용되는 syscall
명령인가? 32 비트 리눅스가 syscall
을 사용하지 않습니까?
샘플 테스트 내 32 비트 리눅스 (우분투 정밀)에
,이 프로그램은 코어 덤프로 종료 : 내가 대신 syscall
의 sysenter
으로 시도했습니다
global _start
_start:
mov eax, 4 ; 4 is write
mov ebx, 1 ; 1 is stdout
mov ecx, message ; address of string
mov edx, length ; number of bytes
syscall
mov eax, 1 ; 1 is exit
xor ebx, ebx ; return code 0
syscall
message:
db 10,"Hello, World",10,10
length equ $ - message
,하지만 충돌 같은 길.
[int "0x80"또는 "syscall"이 무엇인가요?] (http://stackoverflow.com/questions/12806584/what -is-better-int-0x80-or-syscall) – Michael
실제로 여기 뭔가 관련이 있습니다. (http://stackoverflow.com/a/12806910/279335), 큐에 응답하지 않습니다. stion. 인텔의 32 비트 모드에서는'syscall '을 사용할 수 없지만 어셈블러는 이것을 32 비트 모드로 컴파일했다. 어설 션이 불분명하거나 잘못되었습니다. 그런 다음 불법적 인 명령으로 인해 코어 덤프가 발생하지만이 명령어는 Pentium II로 시작하는 모든 Intel CPU에서 사용할 수 있으며 그 이상입니다. 그는'sysenter'에 대해서 언급했는데, 나는 같은 결과로 시도했다. 어쨌든 리눅스 ABI에서는'sysenter'에 대해서는 언급하지 않았고'int 80h' 또는'syscall' 만 보았습니다. – Hibou57
글쎄, "[System Calls (wiki.osdev.org) (http://wiki.osdev.org/System_Calls)"에 따르면,'syscall'은 인텔의'sysenter'에 해당하는 AMD입니다. "인텔 CPU에서 펜티엄 II부터 새로운 명령어 쌍 sysenter/sysexit가 등장했습니다. 모드 변경의 오버 헤드를 제한하여 사용자 모드에서 커널 모드로 신속하게 전환 할 수 있습니다. ** 유사한 명령 쌍이 AMD에 의해 만들어졌습니다 : Syscall/Sysret **. 그러나이 명령어의 동작은 Intel의 것과 다릅니다. * " – Hibou57