Nel mondo dell’informatica quasi ogni giorno abbiamo la nascita di una tecnologia e tutto questo porta ad avere pezzi di hardware eterogenei che vengono pilotati da comandi diversi. Uno dei compiti principali del kernel di un sistema operativo è fare da mediatore tra l’hardware ed il software, quindi se un lettore di suoni vorrà suonare qualcosa dovrà chiedere al kernel se può utilizzare quella determinata scheda sonora. Il kernel farà i controlli e provvederà a rendere disponibile la scheda sonora al software che ne ha fatto richiesta, nascondendo ad essa ogni dettaglio sul tipo di chip, sul tipo di connettori presenti ed altre specifiche hardware. I moduli di kernel responsabili della gestione delle schede hardware si chiamano driver che consentono di far utilizzare i dispositivi al sistema operativo e quindi all’utente finale.
Precedentemente abbiamo parlato di un software che faceva richiesta al kernel su come utilizzare una scheda sonora, certo questo è un modo di spiegare il fenomeno un pò vago, per Linux e quindi per tutti i sistemi Unix ogni singolo pezzo di hardware è rappresentato da un file. Per ogni pezzo del nostro computer avremo quindi un file nella directory /dev di Linux ( da ora in poi mi riferirò ad una distribuzione Ubuntu 10.04 ). Per utilizzare il lettore DVD occorre utilizzare il dispositivo /dev/dvd che, come /dev/cdrom, non è altro che un collegamento a /dev/sr0, quindi se diamo il comando: dir -l /dev/sr0 avremo questo output:
brw-rw—-+ 1 root cdrom 11, 0 2011-02-15 09:26 /dev/sr0
vediamo che può essere utilizzato in lettura e scrittura dall’utente root e dal gruppo cdrom. Diamo il comando: cat /dev/sr0 e vediamo che la risposta è che “nessun supporto è presente”, allora inseriamo un DVD e diamo il comando: tail /dev/sr0 e vedremo che apparirà l’ultima parte del contenuto del file ( non provate cat perché se il DVD è pieno, vi apparirà una serie di simboli strani che per bloccare occorre premere Ctrl+C ). In sostanza il DVD è visto come un semplice file sul quale posso dare tutti i comandi che normalmente si danno ai file. Prendiamo ad esempio la scheda sonora che è rappresentata dal file /dev/audio, se scaricate un file xxxx.au e date questo comando: cat xxxx.au > /dev/audio, sentirete che verrà riprodotto per intero, invece con il comando: tail xxxx.au > /dev/audio verrà riprodotta solo la parte finale.
A questo punto però occorre dire che esistono due tipi di dispositivi, perché una scheda sonora non sarà mai trattata come un hard disk, a blocchi ed a caratteri, visibili dalla prima lettera ( b = blocchi, c = caratteri ) dell’output del comando ls -l /dev. I dispositivi a blocchi sono come dei fogli bianchi sui quali scarabocchiare come vogliamo, come ad esempio hard disk, floppy disk, cdrom, dvd ed altri. I dispositivi a caratteri sono come un nastro adesivo sul quale è possibile scrivere solo su un lato e soprattutto una lettera per volta senza poter rileggere ciò che è stato scritto, come ad esempio porte seriali, modem, mouse ed altro.
Come fa Linux ad associare un particolare dispositivo al lettore dvd, certo non dipende dal nome del file. In realtà i file della directory /dev o sono link al file vero e proprio o sono file speciali che al posto della lunghezza del file hanno due numeri, ad esempio per /dev/sr0 sono 11 e 0 ( zero ). Questa coppia di numeri identifica univocamente il dispositivo e prendono il nome di Major Number e Minor Number, il primo identifica la classe, ad esempio tutti i lettori dvd e cdrom, mentre il secondo il dispositivo in particolare. Ad esempio se abbiamo un lettore dvd ed un lettore cdrom sul nostro sistema, uno avrà un minor number e l’altro un altro numero diverso dal primo, anche se hanno lo stesso major number.
Alcuni si saranno accorti che, ad esempio il dispositivo a blocchi sda o per i vecchi dischi IDE hda, hanno anche altri numeri, sda1, sda2, sda3 che non sono altro che le partizioni del disco sda, ossia il primo disco SATA del sistema. Concludiamo dicendo che parlare di file per i dispositivi è un pò riduttivo perché ad esempio la scheda audio consente di suonare i file audio .au, ma con i comandi per i file non è possibile aumentare o diminuire il volume, per questo compito abbiamo una funzione del kernel che si chiama ioctl() ( Input Output Control ). Alcuni dispositivi avranno bisogno solo di pochissime o nessuna funzione extra, pensiamo ai dispositivi a blocchi come hard disk o lettori dvd. Oggi anche il sistema Linux ha fatto passi da gigante nel riconoscere automaticamente molti dei dispositivi in commercio e con l’avvento di udev ( magari in un articolo futuro vedremo cos’é e come funziona ) tutto è stato reso più intuitivo e semplice.