GNU/Linux >> Linux Esercitazione >  >> Linux

Cos'è meglio int 0x80 o syscall nel codice a 32 bit su Linux?

  • syscall è il modo predefinito per entrare in modalità kernel su x86-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 a syscall , 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


Linux
  1. Linux:parti proprietarie o chiuse del kernel?

  2. Cosa rende fondamentale un server Linux del kernel?

  3. Cosa sono i codici di uscita Bash in Linux

  4. Limitazione dell'accesso alle chiamate di sistema per un'applicazione Linux

  5. Cosa significa dire che il kernel Linux è preventivo?

Cosa fare in caso di panico del kernel Linux

Cosa significa __init nel codice del kernel di Linux?

Qual è l'attuale sorgente del kernel Linux?

Cosa sono la memoria alta e la memoria bassa su Linux?

qual è una risoluzione di jiffie nel kernel Linux

Requisiti per il porting di Linux su un'altra piattaforma