2012-10-10 13 views
20

Quando un programma viene compilato, viene convertito in codice macchina che può essere "compreso" dalla macchina. In che modo questo codice macchina interagisce con il sistema operativo per fare cose come ottenere input dalla tastiera? Per me, sembra che il codice macchina debba essere eseguito a un livello inferiore rispetto al sistema operativo e, pertanto, non riesco a capire come il sistema operativo possa fungere da intermediario tra l'applicazione compilata e l'hardware.Come interagisce un programma compilato con il sistema operativo?

PS: Ho appena iniziato la programmazione C++ e sto cercando di capire come cin e cout lavoro

+1

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. –

+1

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

risposta

23

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.

+1

Ottimo lavoro che lo spiega in un modo molto semplice. –

+2

la CPU può anche funzionare in più modalità (kernel e utente), con il codice del sistema operativo eseguito nella modalità kernel con privilegi più elevati. – OrangeDog

+0

Grazie .. è stata un'ottima risposta. Giusto per essere chiari, sarebbe corretto dire che una chiamata di sistema è come un'interruzione che interrompe l'esecuzione del codice dell'applicazione e gli switch sono fuori con (inizia l'esecuzione di) il codice del SO? – mahela007

5

Il sistema operativo fornisce system calls che i programmi possono chiamare per avere accesso ai servizi di livello inferiore.

Si noti che le chiamate di sistema sono diverse dalla funzione system() che è probabilmente utilizzata per eseguire programmi esterni.

Le chiamate di sistema sono usati per fare le cose come accedere ai file, comunicare attraverso la rete, richiedere memoria heap, ecc

Problemi correlati