Dischi rigidi, BIOS e sistema operativo Se vi è già capitato di dover installare un nuovo disco rigido sul vostro PC, o anche semplicemente di dover installare un nuovo sistema operativo sullo stesso disco, avrete certamente visto la complicata logica di funzionamento e le difficili interazioni tra hardware, BIOS e sistema operativo. Perché, per esempio, certi PC non riconoscono dischi maggiori di 8,4 GB (come tempo fa non riconoscevano quelli oltre 528 MB), perché serve almeno Windows 95 OSR2 per vedere partizioni maggiori di 2,1 GB, oppure, come mai installando un nuovo disco cambiano le lettere assegnate alle partizioni vecchie, creando problemi alle applicazioni? Per capire questi problemi, bisogna entrare profondamente nella struttura di memorizzazione dei file, vedendo che ruoli giocano disco, BIOS e sistema operativo. Largomento in sé non è complicato, ma non è certamente nemmeno breve. Tuttavia, è certamente un argomento importante, non fosse altro perché tutti i primi sistemi operativi per PC, non solo quello di Microsoft, contenevano nel nome la sigla DOS, Disk Operating System. Esporremo gli argomenti entrando in tutti i particolari necessari a capire cosa accade internamente, evitando però dettagli inutili, come, per esempio "il byte tal dei tali indica che ...". Parleremo solamente dei PC compatibili IBM, con dischi E-IDE e sistemi operativi eredi del DOS (Windows 3, 95, 98 ed NT, oltre ad OS/2), che comunque costituiscono da soli la stragrande maggioranza dei casi e che sono proprio quelli più afflitti da problemi. Addentrandosi nei dettagli di funzionamento si capirà che tutte o quasi le difficoltà derivano dallorigine del PC, e del suo sistema operativo, come sistema "giocattolo". Sembra che, nello sforzo di creare velocemente qualcosa di funzionante, i creatori dei primi PC non abbiano perso nemmeno un secondo per pensare a come organizzare la struttura generale della macchina, in modo che la sua evoluzione risultasse logica ed ordinata. Questa partenza sbagliata ha poi finito per causare problemi di compatibilità in tutti i ventanni successivi. Mentre la tecnologia degli apparati fisici ha fatto passi da gigante, i dettagli tecnici di organizzazione generale dei PC creano limpressione che questo "ramo dellalta tecnologia" abbia più a che fare con lantiquariato che con lingegneria!
Introduzione I concetti essenziali da studiare per capire il funzionamento dei dischi rigidi sono i seguenti: 1) I parametri "fisici" dei dischi (cilindro, testina, settore), e l'indirizzamento tramite l'INT 13h del BIOS che li usa, con i problemi che questo causa; 2) La struttura di indirizzamento logico dei dati su disco (Directory e File Allocation Table); 3) I canali E-IDE, primario e secondario, con la possibilità per un disco di essere master o slave sul canale, e i dischi "logici", cioè le partizioni, con le loro strutture di identificazione: boot record, master boot record e sistema dinamico di assegnazione delle lettere alle unità. I protagonisti del racconto sono il disco rigido, con la sua elettronica di controllo, e il software che lo usa, cioè le applicazioni. Queste di solito non parlano direttamente al disco se non attraverso il sistema operativo. In origine, e spesso anche ora, tra disco e sistema operativo cera il cosiddetto BIOS, Basic Input/Output System, che faceva da messaggero tra i due. La funzione specifica implicata si chiama "interrupt 13h", e molti problemi con le dimensioni dei dischi nascono da qui. Parleremo poi del "file system", cioè della struttura astratta di un disco secondo il sistema operativo, con file e directory. Descriveremo il particolare file system del DOS, quello che viene creato con il comando FORMAT ed è impropriamente chiamato FAT da una delle sue strutture interne, la File Allocation Table. Infine si vedrà come i sistemi operativi riconoscano più dischi, e permettano di dividere un disco in partizioni, che vengono trattate come dischi "logici" anche se non sono reali. Qui vedremo che la struttura dati creata dal DOS per dividere un disco, attraverso il noto programma FDISK, è universalmente riconosciuta e utilizzata dagli altri sistemi operativi per PC.
I parametri "fisici" Per capire comè fatto un disco rigido è utile pensare ad un vecchio giradischi. Ci sono alcune differenze essenziali: nel disco rigido ci sono più di un disco (tre o quattro), tutti imperniati attorno allo stesso asse di rotazione, con le testine di lettura/scrittura che si affacciano su entrambe le superfici di ogni piatto, non costrette a seguire una traccia a spirale, ma libere di essere portate avanti ed indietro su tutta la superficie. Essendo però unico il blocco dei bracci che le trasporta, sono comunque costrette a stare tutte alla stessa distanza dallasse, una sotto laltra (se si pensa lasse posizionato in verticale). Per dire in che punto del disco è posizionata una zona contenente dati (scritti magneticamente sulla superficie), il cosiddetto settore fisico, si sono usati fin dall'inizio tre numeri: il numero di cilindro (Cylinder, C), il numero di testina (Head, H) ed il numero di settore (Sector, S). Il numero di testina individua ovviamente la testina che si occupa della lettura/scrittura dei dati, ma anche, contemporaneamente, la superficie su cui si affaccia. Il numero di cilindro individua la distanza dal centro del settore fisico, cioè, in pratica, la posizione del braccio che porta le testine, ed è il numero dordine della traccia su cui esso si trova, quando tutte le tracce (concentriche) siano state numerate consecutivamente a partire dalle più esterne. Infine, lungo la circonferenza di ciascuna traccia sono ricavati i settori fisici, che sono blocchi di bit, nel nostro caso sempre 512 byte, che costituiscono l'unità minima di allocazione dell'informazione sul disco. Questo significa che se interessa anche un solo bit in un dato settore, il disco deve scrivere o leggere l'intero settore. Le unità di memorizzazione di questo tipo sono dette memorie a blocchi, per distinguerle da quelle ad accesso libero come per esempio la memoria centrale del calcolatore (anche qui, in realtà, esiste un'unità minima di accesso, il byte di 8 bit, ma in genere si tende a consideralo come un'unità indivisibile, atomica). Il modo naturale per colloquiare con una memoria a blocchi è quello di numerare in modo consecutivo i blocchi ( 0, 1, 2, ... ), il cosiddetto "indirizzamento logico", e di passarle richieste come "leggi il blocco 137" oppure "scrivi il blocco 5724". In questo modo si ha un cosiddetto "interfacciamento astratto" con la memoria, non occorre sapere come è costruita, per esempio sapere che è un disco. Disgraziatamente i costruttori dei primi PC non hanno tenuto in alcun conto questo elementare principio ingegneristico di modularità, che permette di assemblare più parti distinte in modo che il costruttore di una sia costretto a sapere solo il minimo indispensabile riguardo alle altre. Al contrario, si sono invece costretti i programmi che vogliono memorizzare su disco (BIOS, sistema operativo o addirittura applicazioni) a sapere molto su di esso, e cioè non solo di che tipo di memoria si tratta, ma anche i dettagli su dove memorizzare i dati in termini di cilindro, testina e settore. E' evidente che da qualche parte qualcuno dovrà tradurre il numero di indirizzamento logico con cui i programmi "pensano", in una posizione sul disco, per esempio nei numeri CHS, ma la cosa più sensata è che se ne occupi l'elettronica di controllo del disco. L'aver fatto la scelta opposta ha implicato che i programmatori si occupassero di dettagli di macchine non costruite da loro, producendo programmi che avrebbero smesso di funzionare quando fosse cambiato il mezzo di memorizzazione. Tutto questo non è affatto teoria. I problemi si hanno non solo passando dai dischi ad una qualche forma di memoria permanente a stato solido, ma anche dai primi rudimentali dischi a quelli attuali. Nel sistema di numerazione CHS si presuppone che ciascuna traccia abbia lo stesso numero di settori, e questo dato è usato per la conversione dall'indirizzo logico a quello fisico. Le tracce esterne però sono più lunghe delle interne e hanno perciò la possibilità fisica di contenere più settori di queste. Tutti i dischi moderni sfruttano questa possibilità, e questo, da solo, li rende dei meccanismi diversi e incompatibili con l'indirizzamento CHS. Se avete però visto i dati riguardanti un disco qualsiasi avrete anche visto che vengono ancora riportati il numero di cilindri, di testine e di settori, come se quanto appena detto non valesse. Come si spiega? In realtà quei numeri sono una finzione, ed hanno poco a che vedere con la geometria reale del disco (per esempio, tipicamente viene riportata la presenza di 64 testine, quando non sono quasi mai più di 6 od 8). Nella seguente tabella sono riportati i valori massimi consentiti di questi parametri per, rispettivamente, lo standard E-IDE, che riguarda la struttura costruttiva dei dischi di cui ci occupiamo qui, e l'interrupt 13h del BIOS, quello che si occupa di fare da mediatore per la lettura/scrittura su disco tra le applicazione e l'elettronica di controllo del disco stesso. LINT 13h è cioè colui a cui tutte le applicazioni si rivolgono per effettuare letture e scritture su disco, ed è la causa principale di tutti i problemi con la dimensioni dei dischi. I programmi più recenti possono scavalcarlo, per esempio Windows 95 non lo usa, ma poiché non tutte le parti del sistema sono nuove allo stesso modo, le loro limitazioni si riflettono anche su quelle che lo sono.
I valori dipendono, come tutto nei calcolatori elettronici, da quanti bit sono usati per rappresentare i rispettivi numeri, e sono quindi potenze di due. Fa eccezione il numero di settori, per cui si è scelto di iniziare la numerazione da 1 e non, come solito, da 0, perdendo una possibilità (63 invece di 64, 255 invece di 256). Trascurando questo piccolo dettaglio, i "numeri magici" per i dischi, espressi in mega e gigabyte "binari", dovrebbero essere potenze di due: 16, 32 e 512 MB, 2, 8 e 128 GB, ecc. . I numeri che di solito si vedono in giro sono invece diversi, oltre che per il motivo di sopra, anche perché, quando ci si riferisce ai dischi, in genere MB e GB sono, rispettivamente, un milione ed un miliardo di byte, e non, come solito, 10242 e 10243 byte. I numeri massimi di combinazioni possibili, dato dal prodotto dei rispettivi valori di C, H ed S, produce i valori del numero di settori "indirizzabili", i quali, moltiplicati per i 512 byte di un settore, producono i famosi valori di soglia che hanno creato e creano problemi quando la dimensione tipica di un disco rigido li supera. Ecco quindi i famosi 528 MB, superati circa nel '95, gli 8,4 GB cui si sta arrivando ora, nel '98, ed il valore di 137 GB, prima di arrivare al quale forse i dischi E-IDE passeranno di moda a favore dei dischi SCSI o FireWire, non piagati da simili, stupidi problemi. Per capire perché questi numeri sono problematici bisogna spiegare in che modo viene richiesta ed effettuata un lettura/scrittura su disco. In origine l'applicazione inviava al BIOS i numeri CHS in cui scrivere o leggere i dati. Poi però i dischi si sono evoluti ed i numeri CHS non hanno più potuto rappresentare le posizioni su disco, per cui ora l'unico modo per scrivere e leggere dati su di essi è passargli l'indirizzo logico di questi. Il software però, che è sempre indietro di anni rispetto all'hardware, è ancorato alle vecchie usanze e quando qualche programma vuole scrivere su disco, cerca sempre di usare il BIOS con i suoi parametri CHS. La sequenza di traduzioni è quindi la seguente: l'applicazione vuole scrivere nell'indirizzo logico X, e, invece che comunicarlo al controllore del disco, lo cambia in un valore CHS (che crede essere reale per il disco mentre invece è fittizio), lo passa al BIOS che lo comunica al controllore del disco il quale provvede a tradurre il valore CHS fittizio in un indirizzo logico X, al quale, infine, sa che posizione del disco far corrispondere! Per fare un'analogia, si può pensare che noi (l'applicazione) vogliamo comunicare con uno straniero (il disco). Non parliamo la stessa lingua, ma conosciamo entrambi l'inglese (indirizzamento logico), con cui potremmo facilmente colloquiare. Invece, poiché una volta la lingua internazionale era il latino (numerazione CHS), ci sforziamo di scambiarci messaggi in latino, perché possiamo farlo solo attraverso un messaggero (il BIOS), costretto a parlare solo il latino perché in giro c'è ancora qualcuno (software "antico") che non capisce linglese. Inutile dire che la situazione non sarebbe ideale, mentre tutto questo è normale nel mondo dellalta tecnologia dei PC! Per spiegare in dettaglio i "numeri magici", è utile distinguerli a seconda della loro origine, che può essere il sistema operativo o lhardware, inteso come standard E-IDE + INT 13h del BIOS. In questa sezione ci occupiamo dei secondi, iniziando però con uneccezione, che non è di attualità, ed è un problema di sistema operativo: il limite dei 32 MB. Facciamo così perché è il più semplice di tutti, perché è stato storicamente la prima "barriera" per i dischi fissi e perché, pur riguardando il sistema operativo, non implica il file system ma la visione "fisica" che questo ha del disco. Abbiamo detto che internamente il sistema operativo utilizza un indirizzo logico dei settori (Logical Sector Number, LSN), che in teoria potrebbe passare direttamente al controllore del disco in quella che si chiama Logical Block Addressing, LBA. Fino al DOS 3 si usavano due byte per gli LSN, potendo così indirizzare 216 = 65.536 settori di 512 byte, per un totale di 32 MB binari (33.554.432 byte). Questo limite fu superato solo con lintroduzione del DOS 4 e luso di 4 byte, che permettono in teoria di gestire 232 * 512 = 2 TB. Di conseguenza, se per esempio volessimo installare una vecchia copia di DOS 3.3, dovremo far attenzione ad installarlo in una partizione nei primi 32 MB del disco. Poiché invece lLBN non viene passato al disco direttamente (LBA), ma viene sempre convertito, prima di essere passato al BIOS, in un valore CHS, con al massimo 16 testine (standard E-IDE), 1.024 cilindri e 63 settori (INT 13h del BIOS), si possono gestire dischi fino a 528.482.304 byte (che, come abbiamo visto, non sono esattamente 512 MB binari). Questa è la cosiddetta barriera dei 528 MB. I numeri CHS specificati dallo standard E-IDE hanno un rapporto con la realtà, quelli del BIOS derivano solo dallaver usato inizialmente 1 byte per ciascun valore, con un massimo di 256 possibilità. Per adeguarsi un poco, due bit per i settori sono stati passati ai cilindri, arrivando a 256 / 4 = 64 settori e 256 * 4 = 1.024 cilindri. La situazione è migliorata di poco e, anche se qualche BIOS ha passato altri 2 bit dalle testine ai cilindri (64 testine e 4.096 cilindri), la gran massa dei programmi ha tenuto queste specifiche. I programmi non specificano più di 1.024 cilindri e 63 settori perché non possono "dirli" e più di 16 testine perché i controllori dei dischi non possono "capirle". Per superare questi limiti si sono create una serie di finzioni e traduzioni tra queste finzioni. Prendiamo un caso concreto: disco con 3 superfici (6 testine), 6.810 tracce su ogni superficie e da 122 a 232 settori su ogni traccia, per un totale di 7.539.840 settori e 3,8 GB. I produttori, che si attengono in genere ai 63 settori per traccia, lo specificano come un disco con 16 testine e 7.480 cilindri. Fanno ancora, non casualmente, 7.539.840 settori e 3,8 GB. I numeri 7.480, 16 e 63 dati dal produttore si dicono "geometria logica" del disco. Si può pensare che sul disco compaiano tre porticine in cui inserire numeri C, H, S, fino ai limiti dati, per ordinargli di reperire uno dei 7.539.840 settori. I programmi però possono esprime al massimo 1.024 cilindri. Per rappezzare la situazione si è inventato lE-CHS, Extended CHS, che consiste nel presentare alle applicazioni la "geometria tradotta" del disco. In pratica, visto che per le applicazioni le testine possono essere fino a 256, si moltiplicano queste per 2, 4, 8 o 16, dividendo per lo stesso fattore il numero di cilindri. Nel nostro caso 16 * 8 = 128 testine e 7.480 / 8 = 935 cilindri, rientrando nei limiti (del BIOS). Tutte le applicazioni "credono" che il nostro disco abbia davvero 935 cilindri, 128 testine e 63 settori e usano questi valori. Per quanto riguarda la traduzione, ora se ne occupano i BIOS stessi, ma nei primi tempi erano necessari i cosiddetti disk manager che intercettavano i messaggi BIOS/applicazioni, cambiandoli da geometria logica a geometria tradotta e viceversa. Le applicazioni più moderne possono in realtà passare direttamente lindirizzo logico dei settori, lLSN, al disco, usando la modalità detta LBA, Logical Block Addressing, ma la convivenza sullo stesso computer con applicazioni più "antiche" (intendendo con questo anche parti del sistema operativo, nel caso di Windows 95 per esempio) impone alle più moderne i limiti delle più vecchie. Incidentalmente, il numero LBA ha solo 28 bit e non 32 come lLSN, perché lo standard E-IDE usa 16 bit per i cilindri, 4 per le testine ed 8 per i settori, che in totale sono appunto 28 bit (interpretati come unico numero, non come CHS). Anche con i trucchi visti però permane il limite del BIOS. LE-CHS non aiuta assolutamente in questo caso. Infatti se il fattore di moltiplicazione e divisione è N, si hanno al massimo 1.024 * N cilindri, 256 / N testine, 63 settori, per un massimo di (1.024 * N) * (256 / N) * 63 = 16.515.072 settori (e 8.455.716.864 byte). Questo è il limite degli 8,4 GB ora di attualità. Essendo un limite del BIOS, può capitare che, volendo installare un nuovo disco di capienza superiore agli 8,4 GB senza perdere parte della capacità del drive, dobbiamo aggiornarlo, operazione sempre molto delicata. Inoltre, come si può capire da quanto detto finora, il problema fondamentale risiede nei programmi che usano lINT 13h, cioè in tutto il software che utilizza questo modo ancestrale di accedere al disco. Non si tratta solo di vecchissimi software, perché sistemi ibridi come Windows usano molto più codice vecchio di quanto il marketing Microsoft vuol far intendere. Quanti siano questi problemi si vedrà solo quando i dischi di dimensione superiore agli 8,4 GB diventeranno un fatto comune.
La struttura logica dei dati su disco, cioè il file system Un altro fattore limitante delle possibilità di utilizzo dei dischi, questa volta dovuto al sistema operativo (DOS), è quello legato alla struttura logica di indirizzamento dei file su disco, la famosa FAT, File Allocation Table. Il nome propriamente si riferisce ad una delle strutture che costituiscono il file system, che sono directory, FAT e boot record per una singola partizione, e tabella delle partizioni + master boot record per il disco nel suo insieme. Notoriamente i dati su disco sono organizzati in unità, dette file (archivi), di diverse dimensioni. Il sistema operativo divide il disco in blocchi e ne assegna un certo numero ad un dato file. Potremmo pensare che questi blocchi siano i settori fisici di 512 byte, ma in realtà, come vedremo in seguito, il DOS e quelli tra i suoi eredi che usano la sua stessa struttura logica del disco ( FAT) usano blocchi, detti "cluster" (gruppi o grappoli), costituiti da 2, 4, 8, ecc. settori come unità minima da assegnare ad un file. Nel seguito useremo prevalentemente la parola blocco invece di cluster. E importante capire che quando scrive o legge i dati su disco, il sistema operativo comanda la lettura/scrittura di un settore alla volta, non di un cluster alla volta: il blocco di settori è usato solo per lassegnazione (allocazione) di spazio, perché assegnare unità troppo piccole richiederebbe troppe risorse elaborative. I file sono caratterizzati, per l'interazione con gli umani, da un nome, il nome del file appunto. Perché il file sia utilizzabile da un'applicazione però (che non è umana!) c'è bisogno di passarle non il nome, ma l'indirizzo fisico su disco. C'è quindi bisogno di una struttura dati in cui siano elencati tutti i nomi dei file su disco e, accanto a ciascuno di essi ci siano in dati necessari per rintracciarli. Questi dati, visibili solo al sistema operativo, sono semplicemente l'indirizzo del primo dei blocchi che costituiscono il file (quello che in termini informatici si dice un puntatore al file). La struttura dati che contiene i nomi dei file con i loro indirizzi (oltre ad alcune altre proprietà del file, ad esempio la sua dimensione, la data di creazione e modifica, informazioni di accesso come la scrivibilità e visibilità del file, ecc.) si chiama, opportunamente, directory (elenco). Quando passiamo il nome di un file ad una applicazione, questa chiede al sistema operativo di scorrere la directory alla ricerca del nome del file. Se viene trovato, assieme ad esso c'è anche l'indirizzo necessario perché l'applicazione reperisca il file su disco. Naturalmente direte che c'è qualcosa di più perché non esiste una sola directory che contenga i nomi di tutti i file del disco. In realtà era così solo nel DOS 1.0, che era un giocattolino scritto in qualche settimana da un programmatore di Seattle, non Bill Gates come si pensa di solito, ma un tale Tim Patterson. Se i file sono tanti non basta un unico "contenitore" per tenere ordine logico tra essi. Il modo migliore è quello di una struttura gerarchica come quella che ordina i fogli in fascicoli (cartelle) che a loro volta possono contenere altri fascicoli e così via. Questa però è una modifica di poco conto (per la struttura interna, non per gli utenti!): invece di far sì che ci sia una directory unica, basta considerare le directory come un tipo particolare di file, che può essere elencato, cioè contenuto, in unaltra directory. C'è quindi una directory principale in cui ci possono essere directory di livello 1, nelle quali possono trovarsi directory di livello 2, e così via. In DOS questa struttura è esattamente corrispondente a quella di contenitori che contengono altri contenitori, come le bambole russe. In realtà, una directory non contiene fisicamente i file, così come un elenco di indirizzi di persone non contiene le case ed i loro abitanti. Questo è riflesso dal fatto che non può esistere una directory vuota di dimensione, diciamo, 17 MB. La directory è solo un elenco e quindi se è vuota occupa 0 byte. In questo il nome usato dal DOS, "elenco", è più corrispondente alla realtà di quello usato da Windows (95), di origine Macintosh, "cartella". Unaltra conseguenza è che per la cancellazione di un file basta rimuovere il suo nome dallelenco, non serve azzerare fisicamente i suoi bit (in realtà, si modifica anche la FAT, ma questo lo vedremo dopo). Questo permette, tra laltro, la possibilità di recuperare i file cancellati, nel caso non siano stati casualmente sovrascritti i loro bit. L'illusione delle directory come contenitori è data da questo: due nomi di file in directory diverse sono sempre diversi, cioè il nome completo del file, quello che si chiama "percorso" ed è la scrittura consecutiva dei nomi di directory che bisogna percorrere a partire dalla principale per trovarlo, è unico. Questo corrisponde al fatto, più generale, che non sono consentiti, diversamente dal caso di Unix e Macintosh, gli alias, cioè voci di elenco diverse non possono riferirsi allo stesso file. In Unix può quindi capitare che la directory "uno" contenga la directory "due" che a sua volta contiene (un alias della) directory "uno", violando la possibilità per le directory di sembrare contenitori fisici. E' da notare che in Windows 95 sono consentiti gli alias (link), ma il sistema operativo non permette che "due" contenga "uno" se "due" risultava contenuta in "uno", proprio per mantenere la metafora dei contenitori fisici, più intuitiva. Inoltre gli alias, più che donare lubiquità alloriginale appaiono come dei legami (link, appunto) che permettono di ritrovarlo. Resta ora da capire a cosa serva la struttura dati che dà impropriamente il nome a tutto il sistema di allocazione dello spazio su disco in DOS, la FAT, File Allocation Table. Se al momento di creare un file sapessimo che dimensione dargli e questa non variasse mai, l'allocazione di spazio sarebbe facilissima perché basterebbe assegnare i blocchi in modo consecutivo ad ogni nuovo file. Se i file già presenti occupano i blocchi da 0 a 127, per esempio, e dovessimo creare un file di 30 blocchi, basterebbe assegnargli quelli da 128 a 127+30=157. Se fosse così, la directory, contenente l'indirizzo del primo blocco del file ed il numero di blocchi occupati, sarebbe l'unica struttura dati necessaria per il file system. Nella realtà però, i file possono crescere e diminuire in tempi diversi dal momento della loro creazione. Mentre la diminuzione crea al massimo dei buchi, cioè dei blocchi inutilizzati, la crescita crea problemi perché cè la possibilità che i blocchi successivi all'ultimo siano già occupati. La soluzione trovata è quella della cosiddetta lista concatenata (linked list): il blocco successivo non è quello fisicamente successivo ma quello "logicamente successivo", cioè un blocco posizionato ovunque ma considerato lanello successivo della catena di blocchi che costituisce il file. Il reperimento dei dati del file funziona quindi così: dai dati della directory si trova il primo blocco del file, trovato questo si ha anche il numero del blocco successivo, e così via, anello per anello fino allultimo, che è quello che non riporta nessun blocco successivo. Il posto più semplice dove immagazzinare linformazione sul blocco successivo potrebbe essere la fine del blocco stesso, come lanello successivo di una catena è attaccato dove finisce il precedente. Ci sono due motivi, però, per non fare così. Uno è che si vuole che il file contenga solo "dati utente" e non anche "informazioni di servizio". Laltro, più importante, riguarda le prestazioni: laccesso al disco è molto più lento che laccesso alla memoria principale, per cui bisogna evitare il ciclo "leggi un blocco, scopri il blocco successivo, leggilo, scopri il successivo, ecc.". Il metodo utilizzato è quello di tenere in una struttura a parte, la FAT appunto, tutte le informazioni di "concatenamento", quelle che nellipotesi precedente andavano alla fine del blocco e contenevano lindirizzo del successivo. Essendo questa molto più piccola del contenuto del disco, si può caricarla in memoria centrale, elaborarla velocemente per trovare i blocchi che formano il file e leggerlo dal disco in una sola volta. Questo si può fare perché di solito i blocchi sono vicini tra loro e non occorre spostare di molto le testine per leggerli tutti. Come vedremo la FAT-32, studiata per dischi di grandi dimensioni, ha il problema di essere molto più grande della precedente FAT-16 (per dischi di 8 GB occupa 8 MB), e tenerla in memoria può essere un problema: in ogni caso però, il fatto che le informazioni siano concentrate in un unico punto riduce sempre il numero di accessi al disco, migliorando le prestazioni. Per esemplificare, supponiamo di sapere (dalla directory) che il file tal dei tali inizia al blocco 5. Andiamo alla posizione 5 della FAT, e leggiamo 7: significa che il blocco 7 è il successore di 5. Ripetiamo: andiamo alla posizione 7 e troviamo scritto 13, che quindi è il successore di 7, e così via.
Mancano però due cose: bisogna avere un modo per indicare che un blocco è lultimo, ed un altro per indicare che un blocco non è occupato e può quindi essere usato per scriverci dati. Per questo sono stati selezionati due numeri a parte, tra quelli disponibili: quando appaiono, non indicano il blocco successivo ma una di queste due evenienze. Nel caso della FAT ordinaria, la cosiddetta FAT-16, si usano 16 bit per rappresentare i blocchi (cluster), con numeri che vanno da 0 a 216-1=65.535: lo 0 viene usato per indicare un blocco libero, e il 65.535, che è lultimo numero, per indicare che il blocco attuale non ha successore. Esistono in realtà anche altri valori riservati, che servono per esempio per indicare un blocco fisicamente difettoso, ma questo ha poco a che vedere con la struttura logica descritta. Levoluzione della FAT-16, cioè la FAT-32 non riserva valori particolari per "vuoto" e "ultimo": dei 32 bit per cluster solo 28 contengono il numero di blocco successivo, con gli altri 4 utilizzati per segnalazione di blocco vuoto, ultimo, difettoso ecc. . Togliere anche solo 2 bit ai 16 della FAT originale avrebbe significato diminuire troppo il numero di blocchi indirizzabili (16.384 invece di 65.536), mentre invece i 228 = 268.435.456 blocchi garantiti dai 28 bit della FAT-32 sono perfino troppi. Correlati alla FAT ci sono tutta una serie di "barriere", questa volta non sulla dimensione dei dischi ma delle partizioni, che sono le "fette" in cui un disco può essere diviso, in genere per installarvi sistemi operativi diversi. Come nascono queste barriere? Una FAT con N bit di indirizzo può gestire 2N cluster (trascurando i pochi valori riservati quando ci sono). Un cluster è fatto di K settori da 512 byte, con K = 1, 2, 4, 8, 16, 32, 64, 128 (con dimensioni di cluster che vanno quindi da 0,5 KB a 64 KB). Per questo una partizione FAT può gestire al massimo 2N * K * 512 byte. Il valore 2N è inscindibile dalla struttura della FAT, mentre invece i limiti imposti a K riguardano poco o nulla questa struttura. E infatti richiesto che K sia una potenza di 2 e per rappresentarlo si usa un byte, con un massimo quindi di 128 (256 è fuori portata), ma nessuno ha mai sentito la necessità di aumentare questi valori, anzi il valore 128, con dimensione di 64 KB per il cluster è ufficialmente utilizzabile solo da Windows NT, mentre gli altri sistemi operativi si limitano a 32 KB. Il motivo è lo spreco di spazio che consegue allutilizzo di grossi cluster (frammentazione interna). Quando si riempie un cluster infatti, il prossimo byte ha bisogno di un cluster nuovo che viene così occupato e reso inutilizzabile per gli altri file: quindi, anche un file di un solo byte occupa tutto un cluster, per esempio 32 KB, sprecandone una grandissima parte. La dimensione media di un file è difficile da valutare, dipendendo da quali tipi di file si usano, però si può dire che di solito non supera i 32 KB, con tanti file molto più piccoli e pochi file più grandi di questo valore. In queste condizioni un cluster di 64 KB causerebbe uno spreco medio superiore al 50%, assolutamente inaccettabile. Anche i cluster di 32 KB comunque portano a sprechi molto grandi, di circa un terzo dello spazio. Cè da dire che per questo motivo i programmi che creano le partizioni (FDISK per esempio) hanno sempre cercato di tenere la dimensione del cluster più bassa possibile compatibilmente con la grandezza della partizione richiesta, ma non cè nulla che impedisca di usare cluster più grandi, almeno nella FAT-16. Detto questo, passiamo a vedere i valori delle barriere: FAT-12: il primo tipo di FAT, usato dal DOS fino alla versione 2, e tuttora in vigore per i floppy, con 12 bit può indirizzare 212 = 4.096 cluster, che hanno sempre 8 settori e quindi 4 KB (per i dischi rigidi, perché invece per i floppy il cluster è di 1 o 2 settori cioè 0,5 o 1 KB): 4.096 * 4 KB = 16 MB Questo è stato il primo valore limite per le partizioni, risolto con il DOS 3, non semplicemente consentendo un numero maggiore di settori per cluster (una volta si era più attenti allo spreco di spazio!), ma passando alla nuova FAT-16. FAT-16: i 16 bit della FAT-16 indirizzano 216 = 65.536 cluster, il cui valore non è stavolta rigidamente fissato, ma varia da 2 KB a 32 KB, con Windows NT che come abbiamo visto permette anche 64 KB. Il limite è quindi: 65.536 * 32 KB = 2 GB Questo è il noto valore dei 2,1 GB (decimali) che è stato superato con lintroduzione della FAT-32 in Windows 95 OSR2. Per la FAT-16 è interessante vedere la relazione cluster/dimensione massima della partizione, nella seguente tabella:
Da notare che in questo caso, come già detto, se una partizione è fatta con cluster, per esempio, di 4 KB, niente impedisce di usare cluster più grandi, per esempio da 16 KB, pur di avere il programma che la crei in questo modo, come i programmi per partizionare dischi senza distruggere i dati in essi contenuti. FAT-32: in questo caso il limite è al di là da venire, perché 228 = 268.435.456 blocchi sono un numero enorme, ma si può fare una valutazione supponendo di usando cluster di 4 KB, il valore di default attuale: 268.435.456 * 4 KB = 1 TB Con cluster massimi di 32 KB si arriva al valore di 8 TB, ma qui naturalmente il discorso è teorico, perché è improbabile che si continui ad usare un file system primitivo come la FAT per volumi così grandi. Sembrerebbe che la dimensione del cluster non sia più un problema perché, con il valore minimo ammesso di 4 KB si potrebbe arrivare fino a partizioni di 1 TB, e quindi si potrebbe pensare di non dover più utilizzare cluster più grandi per un bel po di anni. Con la FAT-32 però diventa determinante un altro fattore, e cioè la dimensione della FAT stessa. La FAT-16 occupa 2 byte per ciascuno dei 65.536 elementi, cioè al massimo: 2 byte * 65.536 = 128 KB una dimensione che consente di tenerla tutta agevolmente nella memoria principale. Una FAT-32 completa occuperebbe: 4 byte * 268.435.456 = 1 GB Inutile dire che non si può tenere un indice quasi lungo come la cosa cui fa riferimento! Per capire la situazione senza fare confusione si può fissare lidea che il cluster sia di 4 KB. Lelemento di FAT è 4 byte per cui il rapporto partizione/FAT è esattamente 1 a 1.024. Se la FAT completa (cluster di 4 KB) è 1 TB, si vede che nei dischi di circa 1 GB sarebbe occupata per 1/1000, e anche in quelli da 10 GB per 1/100. In ogni caso quasi vuota. La tabella vista per la FAT-16 non ha qui alcun senso, perché la FAT è sempre molto distante dal riempirsi. Il fattore determinante è che non si vuole una FAT troppo "grassa": in pratica Microsoft ha deciso di non permettere che superi gli 8 MB, corrispondenti a: 8 MB / 4 byte = 2.097.152 cluster, rispetto ai 268.435.456 possibili (un millesimo) Si ha quindi la seguente tabella:
Il valore massimo per un dato cluster è ottenuto usando il valore visto sopra, e non il massimo teorico. In questo modo si vede che la grandezza dei cluster usati deve crescere anche con la FAT-32, e molto prima del teorico 1 TB. Per dischi di 32 GB già si torna al valore di 32 KB che spreca un terzo dello spazio! Da ultimo, un accenno ai programmi di formattazione. In DOS se ne occupa il comando FORMAT. Questo agisce diversamente per dischi rigidi e dischetti. I primi hanno già precostituiti i settori fisici, riempiti di dati casuali, ma comunque presenti. Per essi, FORMAT si occupa della "formattazione logica", cioè crea il boot record, la directory principale e la FAT, le ultime due ovviamente vuote (il che non significa inesistenti!). Per i dischetti, prima della formattazione logica FORMAT si occupa anche di quella fisica, scrivendo settori pieni di bit casuali.
Dischi fisici e dischi "logici" Siamo arrivati allultimo argomento, cioè la struttura logica "esterna" dei dischi. Questa struttura logica è formata dal master boot record, che contiene la tabella delle partizioni e le informazioni di boot. Sistemi operativi come OS/2 e Windows NT, che "capiscono" la FAT ma hanno anche un loro file system, utilizzano la stessa struttura di partizione e bootstrap, anche quando usano il loro file system, perché il loro uso è universale sui PC. Abbiamo visto che la struttura dati del DOS è formata da directory + FAT. Quando il sistema operativo accede per la prima volta al disco, deve avere delle informazioni su questa struttura: quanti sono in tutto i cluster, che dimensione hanno, dove sono localizzate la directory principale e la FAT (o meglio, le FAT, perché di solito per motivi di sicurezza se ne tengono due copie). Queste informazioni sono necessarie perché nella prima fase laccesso al disco avviene "a basso livello", cioè non usando nomi come in seguito per i file, appunto perché laccesso "a livello astratto" necessita i dati contenuti in directory e FAT. Il modo più semplice per avere queste informazioni è scriverle nel primo settore del disco (in realtà, nel primo settore di partizione, che è una "fetta" di disco, ma per ora, non avendo visto esattamente cosa sono, si può pensare al primo settore del disco). Questo settore viene chiamato boot record: i dischi infatti non sono una parte passiva del sistema in quanto contengono, almeno uno tra essi se ve ne sono più di uno, il sistema operativo, e il boot record è implicato nel suo processo di bootstrap. In sostanza, oltre alle informazioni sul disco stesso, il boot record contiene del codice che viene eseguito dopo che il BIOS ha fatto tutti i controlli preliminari in fase di accensione. Questo codice ha semplicemente il compito di caricare in memoria il sistema operativo e passargli il controllo. In realtà carica semplicemente un altro programma che ha leffettivo compito di caricare il sistema operativo, ma questa differenza è del tutto irrilevante. Una questione importante è quella che questo codice ha il controllo delle operazioni per qualche istante. Questo fatto è sfruttato dai cosiddetti virus di boot, che si diffondono modificando il boot record di dischetti e dischi rigidi: allavvio prendono il controllo e fanno il loro "lavoro" senza far apparire nulla di anomalo allignaro utente. Tipicamente, si dimentica un dischetto infetto nel drive, si accende, e il PC visualizza linvito a togliere il dischetto perché non contiene un sistema operativo da cui fare il boot. Quel semplice messaggio non proviene, come si potrebbe pensare, dal BIOS che, analizzato il dischetto ha rilevato lassenza del sistema operativo, ma dal codice stesso del dischetto, anche quando questo non contiene alcun file. A quel punto quindi, se il boot record era modificato da un virus, questo è già attivo in memoria. Neanche i dischetti vuoti sono quindi oggetti passivi. La necessità di avere più sistemi operativi sullo stesso disco ha portato allintroduzione delle cosiddette partizioni, che altro non sono che delle "fette" di disco, cioè un certo numero di settori contigui. Ciascuna di esse ha la sua directory principale, la sua FAT (nel caso abbia questo tipo di file system) ed il suo boot record nel primo settore di partizione. Questo almeno per il tipo originale di partizioni del DOS, che in seguito allintroduzione di un secondo tipo di partizione, le "partizioni estese", sono state rinominate "partizioni primarie". Si può dire sostanzialmente che le partizioni primarie sono destinate ad ospitare un sistema operativo, avendo del codice eseguibile nel boot record, mentre quelle estese sono pensate per ospitare dati e applicazioni. Essendo il disco diviso in più partizioni, risulta necessaria una struttura che contenga le informazioni su come è diviso e su quale dei boot record prenderà il controllo. Per questo esiste il master boot record, in cui cè una piccola struttura dati, la tabella delle partizioni, con i valori necessari per individuare la suddivisione del disco, i dati di ciascuna parte e la marcatura di parte "attiva". In pratica ci si trova il valore del primo e dellultimo settore della partizione, un byte che corrisponde al tipo di partizione (cioè di file system contenuto, ad esempio FAT, 12, 16 o 32, HPFS, NTFS, Xenix ecc. , e, quando sia DOS, se è primaria o estesa), ed il byte di attivazione, che ha un valore maggiore o uguale a 128 (80h) se la partizione è attiva (vedere più sotto) altrimenti vale 0. Il DOS 3 permetteva solo quattro partizioni primarie, e quando una di queste veniva resa attiva, le altre risultavano invisibili al sistema operativo caricato. Questo è un comportamento probabilmente dovuto allintenzione di proteggere i dati di un sistema operativo dallaltro, nascondendoglieli. Per le partizioni primarie è ancora così, risultando una invisibile allaltra quando sono sullo stesso disco. E stato però introdotto il tipo di partizione estesa che supera questi ed altri limiti. Una delle quattro partizioni può essere estesa invece che primaria: questa può contenere un numero (quasi) qualsiasi di partizioni, che sono dette "unità logiche". Il sistema operativo può vedere tutte queste unità logiche, idealmente non destinate a contenere sistemi operativi, ma dati e applicazioni. Infatti, pur avendo il blocco di informazioni sulla partizione, ma non possono contenere il codice di bootstrap. Piuttosto di trovare come settore iniziale un boot record, si trova un settore quasi uguale al master boot record, nel senso che, pur non contenendo codice, ha una tabella di partizione. Il meccanismo delle unità logiche allinterno di una partizione estesa si basa sulla concatenazione e per capire come funziona è utile pensare: "partizione estesa" = "resto dello spazio disponibile" Si parte con la partizione estesa iniziale, che chiameremo "estesa 0". Il suo primo settore conterrà i dati della partizione che chiamiamo "logica 1" e quelli di "estesa 1" ( = "resto 1"). A sua volta il primo settore di "estesa 1" contiene i dati di due partizioni, "logica 2" ed "estesa 2" ( = "resto 2"), e così via, ricavando dal "resto" ogni volta una partizione logica e un nuovo resto (se si vuole), in una struttura concatenata che non ha alcun limite. Il motivo per cui più sopra si è detto che possono esservi un numero "quasi" qualsiasi di partizioni, è che il sistema operativo le nomina con le lettere dellalfabeto (inglese) da C a Z, e queste sono solo 24, ma, come si vede, non è un limite dovuto alla struttura dati che le costituisce. Come detto queste strutture dati (master boot record + tabella partizioni, tabelle di partizione estese concatenate, boot record individuali di ciascuna partizione) sono valide e riconosciute anche da sistemi operativi che non usano ma riconoscono la FAT. In questo caso il loro file system particolare sarà semplicemente contenuto in una delle partizioni individuate (e lanciate) nel modo descritto. Il programma che si occupa di creare queste strutture dati è, in DOS, FDISK. Anche se non si divide il disco, cè comunque bisogno di creare un master boot record. Non si può quindi usare FORMAT su un disco rigido su cui non abbia operato FDISK. Invece, come ben noto, per i dischetti basta FORMAT, perché questi, non avendo bisogno di essere "affettati" (sono già piccoli a sufficienza!), non hanno un master boot record ma un normale settore iniziale di boot. Cè infine da discutere il comportamento di bootstrap in presenza di più dischi rigidi. Il controllore E-IDE ha due canali, primario e secondario, a ciascuno dei quali può essere connesso un disco rigido o un cosiddetto dispositivo ATAPI, come CD-ROM e memorie a nastro. In realtà possono esservi anche altri dispositivi E-IDE, connessi tramite schede al bus ISA, oltre ai due normali canali del controllore E-IDE integrato sulla scheda madre, e connesso al bus PCI, ma non tutti i software supportano questa possibilità. Comunque, dal punto di vista logico, si può pensare a tanti canali E-IDE, con ciascuno la possibilità di connettere due dispositivi. Questi due dispositivi sullo stesso canale sono nello stato, uno di "master", laltro di "slave". La condivisione di canale significa che mentre un dispositivo trasmette dati, laltro non può fare lo stesso e deve aspettare che il primo liberi il canale. I nomi master e slave danno però unimpressione non corretta, perché sembra che il "padrone", quando vuole disporre del canale, lo possa a piacere strappare allo "schiavo". In realtà il rapporto è paritario per quanto riguarda la trasmissione dati, cioè uno deve sempre aspettare che laltro finisca per poter trasmettere, e lunica differenza riguarda il processo di bootstrap del sistema operativo. In sostanza, il BIOS deve avere modo di numerare i dispositivi E-IDE: il master del primo canale è il disco 1, lo slave il disco 2, il master del secondo canale il disco 3, ecc. . Quindi, quando deve cedere il controllo, lo dà al codice del master boot record del primo disco, e quindi il sistema operativo lì installato diventa "master" del PC. La sequenza di bootstrap è quindi: il BIOS cede il controllo al codice eseguibile del master boot record del primo disco rigido, che legge la tabella di partizione, individua la partizione primaria attiva, e cede il controllo al boot record di questa partizione, che si incarica di caricare il sistema operativo presente su quella partizione. Ci si può chiedere come si può fare il bootstrap di un sistema operativo che non sia sul primo disco. Il modo è il seguente: lelemento attivo della tabella di partizione non si riferisce ad una partizione reale sul primo disco, ma ad una partizione fittizia di lunghezza nulla, e contiene lindicazione del disco che contiene il sistema operativo di cui fare il bootstrap. Il controllo passa quindi al master boot record di questo disco, proseguendo come prima. Lindicazione è contenuta nel byte di attivazione: 128 corrisponde allo stesso disco 1, 129 al disco 2, 130 al disco 3, ecc. . Resta da vedere quali siano le partizioni visibili al sistema operativo e come questo le nomini. Per capire cosa risulta visibile, in genere basta pensare che sistemi operativi più recenti vedono file system più vecchi, a meno che non ci siano motivi di impedimento. Uno di questi è che le primarie non attive sono invisibili al sistema operativo attivo. Questo però vale solo per le primarie dello stesso disco, le altre sono visibili. Inoltre, anche lordine di riconoscimento segue la storia: le partizioni primarie vengono riconosciute e nominate per prime, le unità logiche sulle partizioni estese solo in un secondo momento. Il complesso meccanismo di nomina è quindi il seguente: si chiama C la partizione di bootstrap individuata come visto (potrebbe anche non essere sul primo disco), si esaminano tutti i dischi in ordine nominando con lettere consecutive le partizioni primarie (escluse quelle invisibili perché non riconosciute dal sistema operativo o perché sono primarie sullo stesso disco della partizione attiva), si ripete lesame e la nomina per tutte le unità logiche nelle partizioni estese (sono visibili anche quelle del disco di bootstrap), ed infine si nominano i dispositivi ATAPI diversi dai dischi, cioè CD-ROM e altre unità rimovibili. Oltre che complesso, lo schema è causa di problemi: quando si modificano i dispositivi connessi o anche solo le partizioni, si ha spesso un cambio di nome dellunità che causa problemi con tutti i programmi che individuano la posizione di file usando i nomi di unità (C, D, E, ... ). Questo è lultimo dei tanti problemi che sono inevitabili quando si mantiene la compatibilità con programmi molto vecchi e nati certamente senza lidea di dover essere lo standard per i decenni successivi.
|