Laddove è coinvolto un sistema operativo, i programmi non parlano ai driver di dispositivo, almeno non direttamente. I programmi parlano con astrazioni che, a loro insaputa, finiscono per parlare con i driver di dispositivo tramite uno o più livelli di astrazione.
Salterò le complessità dei moderni sistemi operativi e userò CP / M , un sistema operativo a microcomputer sviluppato 45 anni fa, come esempio. CP / M era una torta a strati con tre strati:
Programma. Il livello superiore è un programma che fa qualcosa di utile (elaborazione testi, riproduzione di Space Invaders) eseguendo calcoli e I / O. Diciamo che ad un certo punto il programma vuole visualizzare la lettera 'A' che l'utente può vedere. CP / M fornisce un'astrazione nota come console , che dovrebbe essere la ricerca dell'utente che interagisce con il programma. Il modo convenzionale per inviare un personaggio è con alcune istruzioni di assemblaggio:
LD C,2 ; Load 2 into register C
LD E,65 ; Load the ASCII code for 'A' into register E
CALL 5 ; Call CP/M's routine for getting things done
(Se non hai familiarità con loro, i registri possono essere pensati come variabili che vivono nel processore.) Arriveremo a ciò che i numeri magici 2
e 5
sono tutti in un minuto. L'aspetto da asporto qui è che tutto il programma sa che c'è una console e c'è un modo per scrivere su di essa. Non sa o si preoccupa di nulla al di là di questo. Questa è la prima di due astrazioni che CP / M utilizza per l'I / O.
BDOS . L'indirizzo 5
chiamato dal programma è il punto di ingresso per il livello successivo, il sistema operativo di base del disco o BDOS . Il BDOS offre un'intera serie di funzioni numerate che sono come ordinare per numero dal menu di un ristorante. Dici che desideri l'output della console caricando il C
registro con il numero di funzione ( 2
per l'output della console) e il E
registro con il carattere da inviare. L'output della console è un'operazione molto semplice e il BDOS non deve fare molto con esso oltre a chiamare il livello successivo.
BIOS. Il BIOS, o Basic Input / Output System, è il livello in cui vive tutto il codice specifico dell'hardware. Nei sistemi moderni, questo sarebbe considerato un insieme di driver di dispositivo. Come il BDOS, il BIOS fornisce chiamate per un set standard di operazioni molto primitive che il BDOS utilizza per svolgere la propria attività. Viene chiamata una di queste operazioniCONOUT
, che si occupa di ottenere il carattere che il programma ha chiesto di scrivere due livelli sopra su qualunque hardware lo faccia. (A differenza dei PC, allora le cose non erano omogenee. Il sistema di ognuno aveva diversi modi per farlo accadere.) L'output della console è un pass-through semplice per il BDOS, ma fare qualcosa di più complesso come la creazione di un file su un disco potrebbe richiedere molti Il BIOS chiama per manipolare il supporto. Ancora una volta, poiché il BIOS ha un'interfaccia standard astratta, BDOS sa sempre come ottenere ciò che vuole e non gli importa di come lo fa il BIOS.
Probabilmente ti starai chiedendo perché ci sono due astrazioni (da programma a BDOS e da BDOS a BIOS) invece di una sola. La risposta è che CP / M e il suo BDOS potrebbero essere forniti in forma binaria ai produttori di computer, che scriverebbero un BIOS personalizzato con driver di dispositivo per il loro hardware, collegerebbero i due insieme e lo spedirebbero come sistema operativo per i loro sistemi. Questo è stato un grosso problema perché il BDOS era gestito da un'organizzazione e quindi era sempre una quantità nota per i programmi utente, rendendo possibile eseguire le stesse applicazioni su una varietà molto ampia (per il momento) di hardware. Ecco perché esistono sistemi operativi e non scriviamo solo programmi che modificano direttamente l'hardware .
Tutto ciò che ho descritto qui vale anche per i moderni sistemi operativi. Unix, ad esempio, estrae tutto come file. Dà programmi la stessa serie di chiamate di sistema ( open()
, write()
, close()
, etc.) per comunicare se è un disco o una porta seriale. L'insieme di decisioni e astrazioni è molto più complesso, ma alla fine si riduce ancora a individuare quale codice del driver del dispositivo nel livello inferiore deve essere eseguito per consentire l'operazione.