Il Plug-and-Play è un metodo per configurare automaticamente (a basso livello) schede e altri dispositivi presenti nel proprio computer e per dire poi agli appropriati gestori di dispositivo ("device driver") quello che si è fatto. Il compito del Plug-and-Play è di far "accoppiare" dispositivi fisici con il software (gestore di dispositivo) che funziona con essi e di stabilire dei canali di comunicazione tra ogni dispositivo e il suo gestore. Messa in altro modo, il PnP alloca le seguenti "risorse" per i driver e l'hardware: indirizzi I/O, IRQ, canali DMA e regioni di memoria. Se non si capisce cosa siano queste 4 cose si leggano le sotto sezioni che seguono. Una volta assegnate queste risorse, i file per i dispositivi nella directory /dev/ sono pronti per l'uso (a patto che il dispositivo esista fisicamente nel proprio PC).
Quindi il PnP configura risorse, ma configura solo certe risorse. Anche utilizzando pienamente il PnP, buona parte della configurazione dei dispositivi è fatta da qualche altra cosa. Per la configurazione dei modem, è inviata una "stringa di inizializzazione" al modem attraverso l'indirizzo di I/O del "canale". Questa "stringa di inizializzazione" non ha niente a che vedere con il PnP, sebbene il "canale" usato per inviarla al modem è stato allocato dal PnP. L'impostazione della velocità (e di molti altri parametri) di una porta seriale è fatta inviando messaggi al gestore del dispositivo ("device driver") da programmi eseguiti dall'utente (spesso automaticamente all'avvio del sistema). Anche questa configurazione non ha niente a che spartire con il PnP. Quindi quando si parla di PnP, con "risorse" si intende solo un sottoinsieme limitato delle risorse e con "configurazione" si intende solo un certo tipo di configurazione.
Un computer consta di una CPU/processore per effettuare la computazione e di memoria per immagazzinare programmi e dati. Inoltre, ci sono diversi dispositivi come vari tipi di dischi, una scheda video, una tastiera, scheda di rete, schede modem, schede audio, porte seriali e parallele, ecc. C'è anche un alimentatore per fornire energia elettrica, diversi bus sulla scheda madre per connettere assieme i dispositivi e la CPU, e un case per metterci tutto dentro.
In tempi antichi quasi tutti i dispositivi avevano la proprio scheda di interfaccia (scheda a cirtuito stampato). Oggi, oltre a tali schede, molti "dispositivi" hanno un piccolo chip montato permanentemente in un unica scheda detta "scheda madre". Le schede che vengono inserite nella scheda madre possono contenere più di un dispositivo. I chip di memoria sono qualche volta considerati come dispositivi ma non sono plug-and-play nel senso usato in questo HOWTO.
Affinché un computer funzioni correttamente, ogni dispositivo dev'essere sotto il controllo del suo gestore o "device driver" (un software che è parte del sistema operativo e che viene eseguito nella CPU). Questi gestori di dispositivo sono associati con "file speciali" nella directory /dev, sebbene non siano propriamente dei file. Hanno nomi come hda1 (la prima partizione sul disco fisso a), ttyS0 (la prima porta seriale), eth1 (la seconda scheda ethernet), ecc. Per rendere le cose più complicate, il particolare device driver selezionato, diciamo per eth1, dipenderà dal tipo di scheda ethernet che si ha. Quindi eth1 non può semplicemente essere assegnato ad una qualsiasi scheda ethernet che si ha, ma ad un certo driver che funzionerà con il tipo di scheda ethernet installata. Per controllare un dispositivo, la CPU (sotto il controllo del device driver) invia comandi e legge informazioni dai vari dispositivi. Per poterlo fare ogni device driver deve conoscere l'indirizzo usato per tali comunicazioni. La conoscenza di tale indirizzo è equivalente all'impostazione di una canale di comunicazione, anche se quel "canale" è in realtà in bus dati dentro al PC che è condiviso praticamente tutte le altre cose.
I PC hanno 3 spazi di indirizzi: memoria principale, I/O e configurazione (solo nel bus PCI). Solo i primi due (memoria e I/O) sono configurati dal PnP. Tutti questi 3 tipi di spazi di indirizzi condividono lo stesso bus all'interno del PC (inoltre, nel caso del bus PCI, il bus è usato pure per i dati). Ma il potenziale di alcune linee dedicate dice a tutti i dispositivi quando un indirizzo è nello spazio di I/O oppure nello spazio di memoria. I dispositivi sono normalmente localizzati nello spazio di indirizzi I/O (sebbene in alcuni casi questi allochino pure dello spazio in memoria principale). Un indirizzo I/O qualche volta è detto semplicemente "I/O", "IO", "i/o" o "io". È pure usato il termine "porta di I/O". Ci sono due passi principali per allocare gli indirizzi I/O, ecc.: (quel che "ecc." comprende sarà spiegato a breve)
Un terzo passo è dare al dispositivo e al suo gestore un nome nella directory /dev come hda, ttyS0 o eth1. Il processo in due passi appena visto è in qualche modo simile al problema di trovare il numero di casa di qualcuno in una strada. Si deve conoscere il numero di casa e qualcuno deve installare un numero nella facciata della casa in modo che possa essere trovata. Nei computer, il device driver deve conoscere l'indirizzo e il dispositivo hardware deve installare lo stesso indirizzo in uno dei suoi registri. Devono essere fatte entrambe queste cose, ma alcuni fanno l'errore di farne solo una e poi si sorprendono quando il computer non riesce a trovare il dispositivo. Ora per spiegare (nelle tre sezioni successive) cosa comprende l'"ecc." di prima: IRQ, Canali DMA, e Regioni di Memoria. Tutte queste cose (compresi l'indizzi I/O) sono dette "risorse".
Dopo aver letto questa sezione si può leggere Interrupt -- Dettagli per ulteriori dettagli. Quanto segue è intenzionalmente super semplificato. Oltre agli indirizzi, si deve gestire anche un numero di interruzione ("interrupt") (come IRQ5), detto numero di IRQ (Interrupt ReQuest = Richiesta di Interruzione). Si è già detto prima che il gestore del dispositivo deve conoscere l'indirizzo di una scheda per poter essere in grado di comunicare con quest'ultima. Ma cosa dire della comunicazione in senso opposto? Si supponga che il dispositivo necessiti di conoscere l'indirizzo (o il tipo) del suo gestore in modo da porterlo chiamare per chiedere aiuto. Per esempio, il dispositivo potrebbe aver appena ricevuto un sacco di byte destinati alla memoria principale e quindi gli serve chiamare il suo gestore per trasferire questi dati dal suo buffer praticamente pieno alla memoria principale.
Il dispositivo chiede questo aiuto imponendo una tensione particolare in una linea di interrupt (parte del bus). Ci sono l'equivalente di 16 linee e ognuna di queste è comandata (indirettamente) da un certo gestore di dispositivo. Ogni linea ha un unico numero di IRQ (Interrupt ReQuest). Il dispositivo deve mettere il suo interrupt nella linea corretta e il gestore del dispositivo deve restare in attesa dell'interruzione sulla linea corretta. Su quale linea è messo è determinato dal numero di IRQ salvato nel dispositivo. Lo stesso numero di IRQ dev'essere noto al gestore del dispositivo in modo che questo sappia su quale linea di IRQ mettersi in ascolto.
DMA sta per "Direct Memory Access" (Accesso Diretto alla Memoria). È il posto dove un dispositivo ha la possibilità di prendere il controllo del bus principale del computer dalla CPU e trasferire i dati direttamente nella memoria principale. Normalmente la CPU vorrebbe fare questo trasferimento in due passi: 1. leggendo i dati dallo spazio di I/O del dispositivo e mettendoli dentro la CPU stessa 2. scrivendo questi dati dalla CPU alla memoria principale. Con il DMA si fa solitamente un solo passo inviando i dati direttamente dal dispositivo alla memoria. Il dispositivo deve avere tale funzionalità nel suo hardware e quindi non tutti i dispositivi possono fare un DMA. Mentre è in esecuzione il DMA la CPU non può fare molto in quanto il bus principale è usato per il trasferimento DMA.
Quando un dispositivo vuole fare un DMA invia una richiesta DMA usando una linea dedicata per la richiesta di DMA in modo analogo ad una richiesta di interrupt. In realtà il DMA potrebbe essere gestito usando interrupt ma ciò introdurrebbe alcuno ritardi, cosicché è più veloce da fare utilizzando un tipo particolare di interrupt detto DMA-request. Come le interruzioni, le richieste DMA sono numerate in modo da identificare quale dispositivo sta facendo la richiesta. Questo numero è chiamato DMA-channel (canale DMA). Poiché tutti i trasferimenti DMA usano il bus principale (e solo uno può essere attivo in un determinato istante) in realtà usano tutti lo stesso canale, ma il numero del "canale DMA" serve per indentificare chi sta usando il "canale". Nella scheda madre esistono dei registri hardware che contengono lo stato attuale di ogni "canale". Quindi per poter effettuare una richiesta DMA, il dispositivo deve conoscere il suo numero di canale DMA che deve essere salvato in un registro nel dispositivo fisico.
Ad alcuni dispositivi è assegnato dello spazio di indirizzi nella memoria principale come avviene per lo spazio di indirizzi I/O. Quando di installa una scheda di questo tipo, in effetti si sta inserendo un modulo in memoria (per la memoria principale, non solo per la memoria I/O). Questa memoria è condivisa dal dispositivo con la CPU (eseguendo il gestore del dispositivo). Questa memoria può servire come mezzo di "trasferimento" diretto di dati tra il dispositivo e la memoria principale. Non è veramente un trasferimento in quanto il dispositivo mette i dati nella propria memoria che "casualmente" è la memoria principale. Sia la scheda che il gestore del dispositivo devono sapere dov'è questa memoria.
Quindi i gestori dei dispositivi devono essere in qualche modo "collegati" all'hardware che controllano. Questo è fatto fornendo le "risorse" (I/O, Memoria, IRQ e DMA) sia al dispositivo fisico che al software di gestione. Per esempio, nel caso di una porta seriale ci sono solo 2 (delle 4 possibili) risorse: un IRQ e un indirizzo I/O. Entrambi questi valori deve essere forniti al gestore del dispositivo e al dispositivo fisico stesso. Al gestore (e al suo dispositivo) è dato un nome (come ttyS1). L'indirizzo e il numero di IRQ sono salvati in un registro delle scheda del dispositivo fisico (o in un chip nella scheda madre).
L'architettura di un PC fornisce solo in numero limitato di IRQ, canali DMA, indirizzi I/O, ecc. Se ci fossero solo alcuni dispositivi e tutti questi avessero le risorse standardizzate (come indizzi I/O e numeri IRQ unici) non ci sarebbero problemi a collegare i gestori dei dispositivi ai dispositivi stessi. Ogni dispositivo avrebbe delle risorse fisse e non andrebbe in conflitto con qualsiasi altro dispositivo nel computer. Non ci sarebbero due dispositivi che vorrebbero avere gli stessi indirizzi di I/O, numeri di IRQ, ecc. Ogni driver potrebbe quindi essere programmato con gli indirizzi di I/O, l'IRQ, ecc. già codificati all'interno del programma. La vita sarebbe più semplice.
Ma così non è. Non solo oggi ci sono così tanti dispositivi che i conflitti sono una cosa normale, ma qualchevolta uno ha necessità di averne anche più di uno dello stesso tipo. Per esempio qualcuno potrebbe avere più di un disco fisso, un po' di porte seriali, ecc. Per queste ragioni i dispositivi devono possedere un minimo di flessibilità in modo che possano essere impostati a un qualsivoglia indirizzi, IRQ, ecc. siano necessari per evitare i conflitti. Ma alcuni IRQ e indirizzi, come quello del clock e della tastiera, sono piuttosto standard. Questi non hanno bisogno di tale flessibilità.
A parte il problema nel conflitto nell'allocazione delle risorse, c'è anche un problema nel caso si commetta un errore nel dire al device driver quali sono le risorse. Per esempio, si supponga di aver messo IRQ 4 in un file di configurazione quando in realtà il dispositivo è impostato all'IRQ 5. Questo è un altro tipo di errore nell'allocazione delle risorse.
L'allocazione delle risorse, se fatta correttamente, stabilisce inoltre i canali di comunicazione tra l'hardware fisico e i relativi device driver. Per esempio, se un determinato intervallo di indirizzi I/O (risorsa) è allocato sia al gestore di dispositivo che ad un pezzo di hardware, allora in questo modo si è stabilito un canale di comunicazione unidirezionale tra loro. Il driver può inviare comandi ed informazioni al dispositico. In realtà è un po' più che unidirezionale, in quanto il driver può ottenere informazioni dal dispositivo leggendone i suoi registri. Ma il dispositivo in questo modo non può inizializzare una qualsiasi comunicazione. L'allocazione di un IRQ lo rende un canale di comunicazione a due vie, nel quale sia il driver che il dispositivo possono iniziare una comunicazione.