syscall
è il modo predefinito per entrare in modalità kernel sux86-64
. Questa istruzione non è disponibile nelle modalità operative a 32 bit sui processori Intel .sysenter
è un'istruzione utilizzata più di frequente per richiamare chiamate di sistema in modalità operative a 32 bit. È simile asyscall
, un po' più difficile da usare, ma questa è la preoccupazione del kernel.int 0x80
è un modo legacy per invocare una chiamata di sistema e dovrebbe essere evitato.
Il modo preferito per invocare una chiamata di sistema è utilizzare vDSO, una parte della memoria mappata in ogni spazio di indirizzamento del processo che consente di utilizzare le chiamate di sistema in modo più efficiente (ad esempio, non entrando affatto in modalità kernel in alcuni casi). vDSO si occupa anche di più difficili, rispetto al precedente int 0x80
modo, gestione di syscall
o sysenter
istruzioni.
Inoltre, vedi questo e questo.
La mia risposta qui riguarda la tua domanda.
In pratica, i kernel recenti stanno implementando un VDSO, in particolare per ottimizzare dinamicamente le chiamate di sistema (il kernel imposta il VDSO su un codice migliore per il processore corrente). Quindi dovresti usare il VDSO, e ti conviene usare, per le chiamate di sistema esistenti, l'interfaccia fornita dalla libc.
Si noti che, AFAIK, una parte significativa del costo delle semplici chiamate di sistema va dallo spazio utente al kernel e viceversa. Quindi, per alcune chiamate di sistema (probabilmente gettimeofday
, getpid
...) il VDSO potrebbe evitare anche quello (e tecnicamente potrebbe evitare di fare una vera chiamata di sistema). Per la maggior parte delle chiamate di sistema (come open
, read
, send
, mmap
....) il costo del kernel della chiamata di sistema è abbastanza elevato da apportare miglioramenti alla transizione da spazio utente a spazio kernel (ad esempio utilizzando SYSENTER
o SYSCALL
istruzioni macchina invece di INT
) insignificante.
Fai attenzione prima di cambiare :i numeri di chiamata di sistema sono diversi quando si esegue 0x80 o syscall, ad esempio sys_write è 4 con 0x80 e 1 con syscall.
http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html per 32 bit o 0x80 http://blog.rchapman.org/post/36801038863/linux-system-call-table-for -x86-64 per la chiamata di sistema