Questa è una domanda molto buona (meglio di quanto si sa), e c'è molto da imparare . UN SACCO.
Cercherò di farla breve. Il sistema operativo agisce come un livello di astrazione tra software e hardware:
Software
.
/|\
| communicates with
\|/
'
Operating System
.
/|\
| communicates with
\|/
'
Hardware
Il sistema operativo comunica con l'hardware attraverso programmi chiamati driver (ampiamente usato termine), e il sistema operativo comunica con software tramite procedure richiamate sistema chiama (termine non molto usato).
In sostanza, quando si effettua una chiamata di sistema, si esce dal programma e si immette il codice del sistema operativo. Le chiamate di sistema sono l'unico modo in cui i programmatori sono autorizzati a comunicare con le risorse.
Ora mi sarei fermato lì, ma ha anche detto:
A me, sembra che il codice macchina deve funzionare a un livello inferiore rispetto del sistema operativo e, quindi, posso' t capire come il sistema operativo può agire come intermediario tra l'applicazione compilata e l'hardware .
Questo è complicato, ma semplice una volta comprese alcune nozioni di base.
Innanzitutto, tutto il codice è solo codice macchina in esecuzione sulla CPU. Nessun codice è più alto o più basso di un altro codice (ad eccezione di alcuni comandi che possono essere eseguiti solo in una modalità kernel privilegiata). Quindi la domanda è: come può il sistema operativo avere il controllo anche se sta cedendo il controllo della CPU all'utente?
Quando il codice è in esecuzione su una CPU, esiste un concetto denominato interrupt. Questo è un segnale inviato alla CPU che fa sì che il codice attualmente in esecuzione si fermi e venga spento con un altro pezzo di codice, chiamato un gestore di interruzioni .
Esempi di interrupt includono la tastiera, il mouse e, soprattutto, l'orologio.
L'interrupt dell'orologio viene generato regolarmente causa l'esecuzione del gestore di interrupt dell'orologio del sistema operativo. All'interno di questo orologio, il gestore di interrupt è il codice del sistema operativo che esamina quale codice è attualmente in esecuzione e determina quale codice deve essere eseguito successivamente. Questo può essere più codice di sistema operativo o più codice utente.
perché l'orologio è sempre ticchettio, e perché il sistema operativo sempre ottiene questa possibilità periodica di correre sulla CPU, è in grado di orchestrare tutto all'interno del computer, anche se funziona utilizzando lo stesso set di Comandi della CPU come qualsiasi normale programma.
L'applicazione compilata esegue semplicemente chiamate di funzione alle DLL (il sistema operativo, ad esempio kernel32.dll in Windows) che contengono funzioni di altro codice macchina. L'altro codice macchina è scritto appositamente per funzionare con l'hardware, quindi non è necessario. –
Leggermente tangenziale e non proprio una risposta alla tua domanda, ma forse se sei interessato ai confini tra la lingua e il sistema operativo questo ti darà un po 'di timore/paura/disgusto in alcuni dei molti passaggi nel processo chiedo di ...: -/http://stackoverflow.com/a/2444508/211160 – HostileFork