Da MS-DOS, conosco il richiamo di sistema tramite gli interrupt. Nei vecchi giornali, ho visto il riferimento a int 80h
per richiamare le funzioni di sistema su Linux. Da un po 'di tempo ormai, so che lo int 80h
è deprecato a favore dell'istruzione syscall
. Ma non riesco a farlo funzionare sulla mia macchina a 32 bit.Syscall o sysenter su 32 bit Linux?
La domanda
è l'istruzione syscall
per essere utilizzato solo su 64 bit piattaforma? Non 32 bit Linux utilizza syscall
?
Un test campione
Nei miei 32 bit di Linux (Ubuntu Precise), questo programma termina con un core dump:
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
Ho provato con sysenter
invece di syscall
, ma si blocca il stessa strada.
possibile duplicato di [Cosa è meglio "int 0x80" o "syscall"?] (http://stackoverflow.com/questions/12806584/what -is-better-int-0x80-o-syscall) – Michael
C'è davvero qualcosa di correlato, [qui] (http://stackoverflow.com/a/12806910/279335), ma che non risponde alla que bustione. Dice 'syscall' non è disponibile in modalità a 32 bit di CPU Intel, ma l'assemblatore lo ha compilato in modalità a 32 bit; o l'affermazione non è chiara o è sbagliata. Quindi, ottengo un core-dump a causa di un'istruzione illegale, ma questa istruzione è disponibile su tutte le CPU Intel a partire da Pentium II, e la mia è di gran lunga superiore. Ha menzionato 'sysenter', che ho provato con lo stesso risultato. Ad ogni modo, non ho mai visto alcuna menzione di 'sysenter' in Linux ABI, solo' int 80h' o 'syscall'. – Hibou57
Bene, secondo "[System Calls (wiki.osdev.org)] (http://wiki.osdev.org/System_Calls)", 'syscall' è l'equivalente AMD di Intel' sysenter'. Dice "* Sulla CPU Intel, a partire dal Pentium II, è apparsa una nuova coppia di istruzioni sysenter/sysexit. Consente un passaggio più rapido dalla modalità utente alla modalità kernel, limitando il sovraccarico della modalità di modifica. ** Una coppia di istruzioni simile è stata creata da AMD: Syscall/Sysret **. Tuttavia, il comportamento di queste istruzioni è diverso da quello di Intel. * " – Hibou57