Chiamate di sistema

Che cos'è una chiamata di sistema Linux??

Che cos'è una chiamata di sistema Linux??

Cominciando dall'inizio

Prima di approfondire la definizione di una chiamata di sistema Linux ed esaminare i dettagli della sua esecuzione, è meglio iniziare definendo i vari livelli software di un tipico sistema Linux.

Il kernel Linux è un programma specializzato che si avvia e viene eseguito al livello più basso disponibile sul tuo hardware. Ha il compito di orchestrare tutto ciò che viene eseguito sul computer, compresa la gestione degli eventi di tastiera, disco e rete per fornire intervalli di tempo per l'esecuzione di più programmi in parallelo.

Quando il kernel esegue un programma a livello utente, virtualizza lo spazio di memoria in modo che i programmi credano di essere l'unico processo in esecuzione in memoria. Questa bolla protettiva di isolamento hardware e software aumenta la sicurezza e l'affidabilità. Un'applicazione senza privilegi non può accedere alla memoria appartenente ad altri programmi e, se quel programma va in crash, il kernel termina in modo che non possa danneggiare il resto del sistema.

Superare la barriera con le chiamate di sistema Linux

Questo livello di isolamento tra le applicazioni non privilegiate fornisce un eccellente confine per proteggere altre applicazioni e utenti sul sistema. Tuttavia, senza un modo per interfacciarsi con gli altri elementi del computer e del mondo esterno, i programmi non sarebbero in grado di realizzare molto di nulla.

Per facilitare l'interazione, il kernel designa una porta software che consente al programma in esecuzione di richiedere che il kernel agisca per suo conto. Questa interfaccia è nota come chiamata di sistema.

Poiché Linux segue la filosofia UNIX di "tutto è un file", molte funzioni possono essere eseguite aprendo e leggendo o scrivendo su un file, che potrebbe essere un dispositivo. Su Windows, ad esempio, potresti usare una funzione chiamata CryptGenRandom per accedere a byte casuali. Ma su Linux, questo può essere fatto semplicemente aprendo il "file" /dev/urandom e leggendo i byte da esso usando le chiamate di sistema di input/output di file standard. Questa differenza cruciale consente un'interfaccia di chiamata di sistema più semplice.

Involucro sottilissimo

Nella maggior parte delle applicazioni, le chiamate di sistema non vengono effettuate direttamente al kernel. Praticamente tutti i programmi si collegano alla libreria C standard, che fornisce un sottile ma importante wrapper per le chiamate di sistema Linux. La libreria si assicura che gli argomenti della funzione vengano copiati nei registri del processore corretti quindi emette la corrispondente chiamata di sistema Linux. Quando i dati vengono ricevuti dalla chiamata, il wrapper interpreta i risultati e li restituisce al programma in modo coerente.

Dietro le quinte

Ogni funzione in un programma che interagisce con il sistema viene infine tradotta in una chiamata di sistema. Per vederlo in azione, iniziamo con un esempio di base.

vuoto principale()

Questo è probabilmente il programma C più banale che vedrai mai ever. Prende semplicemente il controllo tramite il punto di ingresso principale e poi esce. Non restituisce nemmeno un valore poiché main è definito come void. Salva il file come ctest.c e compiliamolo:

gcc ctest.c -o ctest

Una volta compilato, possiamo vedere la dimensione del file come 8664 byte. Potrebbe variare leggermente sul tuo sistema, ma dovrebbe essere di circa 8k. È un sacco di codice solo per entrare e uscire! Il motivo per cui è 8k è che viene incluso il runtime libc. Anche se togliamo i simboli, è ancora un po' più di 6k.

In un esempio ancora più semplice, possiamo fare in modo che la chiamata di sistema Linux esca piuttosto che dipendere dal runtime C per farlo per noi.

void _start()
asm("movl $1,%eax;"
"xorl %ebx,%ebx;"
"int $0x80");

Qui spostiamo 1 nel registro EAX, cancelliamo il registro EBX (che altrimenti conterrebbe il valore di ritorno) quindi chiamiamo l'interruzione della chiamata di sistema Linux 0x80 (o 128 in decimale). Questo interrupt attiva il kernel per elaborare la nostra chiamata.

Se compiliamo il nostro nuovo esempio, chiamato asmtest.c, ed elimina i simboli ed escludi la libreria standard:

gcc -s -nostdlib asmtest.c -o asmtest

produrremo un binario inferiore a 1k (sul mio sistema, produce 984 byte). La maggior parte di questo codice sono intestazioni eseguibili. Ora stiamo chiamando la chiamata di sistema Linux diretta.

Per tutti gli scopi pratici

In quasi tutti i casi, non dovrai mai effettuare chiamate di sistema dirette nei tuoi programmi C. Se usi il linguaggio assembly, tuttavia, potrebbe sorgere la necessità. Tuttavia, nell'ottimizzazione, sarebbe meglio lasciare che le funzioni della libreria C effettuino le chiamate di sistema e avere solo il codice critico per le prestazioni incorporato nelle direttive assembly.

Come programmare i tutorial sulle chiamate di sistema

Elenco di tutte le chiamate di sistema

Se vuoi vedere un elenco di tutte le chiamate di sistema disponibili per Linux puoi controllare queste pagine di riferimento: Elenco completo delle chiamate di sistema su LinuxHint.com, filippo.io/linux-syscall-table/ e o syscalls.kernelgrok.come

Come aumentare gli FPS in Linux?
FPS sta per Fotogrammi al secondo. Il compito dell'FPS è misurare il frame rate nelle riproduzioni video o nelle prestazioni di gioco game. In parole ...
I migliori giochi di laboratorio dell'app Oculus
Se possiedi un visore Oculus, devi essere informato sul sideloading. Il sideloading è il processo di installazione di contenuti non archiviati sul vis...
I 10 migliori giochi da giocare su Ubuntu
La piattaforma Windows è stata una delle piattaforme dominanti per i giochi a causa dell'enorme percentuale di giochi che si stanno sviluppando oggi p...