Sui processori moderni, le istruzioni della CPU che eseguono o avviano input / output sono privilegiate; inoltre, gli indirizzi di memoria fisica su cui i dispositivi sono mappati sono protetti (in questo caso dal sistema operativo). Inoltre, sono anche privilegiate le capacità di gestione degli interrupt (utilizzate dai dispositivi per segnalare al processore che i dati e / o il dispositivo sono pronti per ulteriori I / O).
Le istruzioni privilegiate, gli indirizzi di memoria e i gestori di interrupt non possono essere eseguiti nel processo in modalità utente che esegue l'applicazione. Pertanto, l'applicazione può solo richiedere l'operazione di I / O dal sistema operativo, di solito tramite una chiamata di sistema, o qualche forma di richiesta sicura nel sistema operativo per accedere alle risorse privilegiate.
Generalmente ci saranno librerie su entrambi i lati della chiamata di sistema. Nell'applicazione in modalità utente, ci saranno alcune librerie di lingua e runtime che eseguono la formattazione e la serializzazione di contenuti che in definitiva invocano le routine del sistema operativo tramite un privilegiato & meccanismo di chiamata protetto (sistema). Il sistema operativo avrà una serie di routine che rispondono alle richieste dell'applicazione e in definitiva accedono al dispositivo.
Tipicamente per un programma C per eseguire una scrittura, che è compiuto nel codice sorgente chiamando una routine di libreria, così il compilatore compila quella chiamata di funzione di alto livello (la scrittura) in una chiamata di funzione di codice macchina, praticamente proprio come la traduzione / compilazione di qualsiasi altra chiamata di funzione.
La chiamata alla funzione si collega a una routine di libreria che alla fine effettua una chiamata di sistema o una richiesta privilegiata nel sistema operativo. Queste stesse librerie sono talvolta scritte in linguaggio assembly (parte in) in modo che possano usare il meccanismo di chiamata di sistema, che di solito è alcune istruzioni speciali del processore che i compilatori normalmente non generano. (Alcuni sistemi dispongono di compilatori C con estensioni che consentono loro di effettuare chiamate di sistema senza bisogno di linguaggio di assemblaggio.)