Guardando il commento, fammi provare questo. Un servizio di sistema è una procedura che viene eseguita con privilegi elevati (solitamente in modalità kernel). Tutto il resto è una chiamata alla libreria.
L'hardware sottostante fornisce un gate per consentire alle applicazioni utente di accedere alla modalità kernel. Il sistema operativo protegge questa porta per la sicurezza di base del sistema.
Facendo un po' di semplificazione qui --- un metodo comune utilizzato dai processori è che il processo attivi esplicitamente un'eccezione (Intel ha un metodo SYSCALL alternativo).
Un sistema avrà una serie di vettori di interrupt/eccezione (puntatore alle procedure del gestore) per rispondere a eccezioni o interruzioni (ad esempio errore di pagina, divisione per zero). Il sistema definirà una serie di vettori (solitamente numeri bassi) per le eccezioni e gli interrupt hardware. Tuttavia, di solito lasciano degli slot che il sistema operativo può utilizzare.
Un'istruzione simile a:
INT #12
Innescherà esplicitamente un'eccezione e richiamerà la dodicesima procedura nel vettore. Un sistema potrebbe permetterti di simulare un'eccezione di divisione per zero facendo questo
Supponiamo che il sistema operativo utilizzi il vettore 123 per i servizi di sistema.
INT #123
chiamerebbe un servizio di sistema. Un sistema potrebbe riservare un vettore separato per ciascun servizio di sistema oppure potrebbe utilizzarne uno e inviarlo.
Quindi faresti qualcosa del genere:
MOVL #23, R0
INT #123
Il valore 23 nel registro 0 indica al gestore di interrupt di richiamare il servizio di sistema #23.
Quindi puoi vedere che tutto questo richiede un linguaggio assembly. Quello che fa ogni sistema operativo è creare wrapper che possono essere chiamati come funzioni da linguaggi di alto livello.
Questa è quindi la sequenza di ciò che accade:
-
Un utente chiama il wrapper denominato con parametri normali. Il wrapper imposta i registri e lo stack per il servizio di sistema.
-
Il wrapper attiva l'eccezione che invia al servizio di sistema.
-
Il servizio di sistema deve quindi controllare TUTTI i parametri. Questo è uno dei motivi per cui i servizi di sistema hanno un sovraccarico elevato. Le eccezioni in modalità kernel causano schermate blu della morte. Se il servizio di sistema deve scrivere in un buffer fornito dall'utente, deve assicurarsi che ogni byte in cui scrive sia memoria scrivibile.
-
Il servizio di sistema fa tutto ciò di cui ha bisogno.
-
Il servizio di sistema esegue un'istruzione hardware per restituire un'eccezione o un interrupt. Ciò ritorna alla modalità utente e alla funzione wrapper.
-
Il wrapper può decomprimere i parametri restituiti nei registri.
-
Il wrapper ritorna al chiamante.
Le chiamate del kernel di basso livello che sono gestite dal kernel sono le chiamate di sistema.
La pagina man dice:
2 Chiamate di sistema (funzioni fornite dal kernel)
3 Chiamate di libreria (funzioni all'interno delle librerie di programma)
Un'immagine pittorica può chiarire:
e