Come sono fatti i dischi dei PC?


Attenzione: le seguenti informazioni sono state scritte molti anni fa...

Boot Sector | Tavola delle Partizioni | File Allocation Table | La struttura della Directory

Lungi dall'essere complete, queste pagine, pur essendo abbastanza tecniche, vogliono essere un aiuto alla comprensione del funzionamento del nostro mezzo di svago e di lavoro.
ATTENZIONE! Le informazioni qui riportate sono MOLTO delicate....Ciò significa che modifcare anche un solo byte sul vostro Hard Disk può comprometterne il contenuto..... Siete stati avvertiti
:-) !!
Tenete anche presente che si discute la struttura di dischi DOS. Per eventuali suggerimenti od ulterioni domande scrivete a questo indirizzo: webmaster@solution.it

L'area di sistema dei dischi: boot, FAT, directory, master boot record, tavola delle partizioni.

BOOT SECTOR (o boot record)

Il primo settore del disco (sett. 1, traccia 0, faccia 0) è il boot sector; sui floppy occupa quindi 512 bytes. Contiene le informazioni relative al tipo di formattazione e le istruzioni necessarie per il caricamento del DOS (se il disco è stato formattato con l'opzione /S).
Il boot sector termina con il codice ASCII 55 (AAH).Negli Hard disk si trova all'inizio di ciascuna partizione bootabile.


Tabella dei parametri situati nel BOOT RECORD
HEXOFFSETLUNGHEZZADESCRIZIONENOTE
00H03 byteinizio programma di caricamentoE9 xx xx oppure EB xx 90
03H 3 8 byte identificativo del sistema (MSDOS5.0)
0BH 11 1 parola numero di bytes per settore < BPB (512)
0DH 13 1 byte numero di settori per cluster < Bios Parameters block (8)
0EH 14 1 parola numero di settori riservati all'inizio < " (1)
10H 16 1 byte numero di copie della FAT < " (2)
11H 17 1 parola numero di voci della directory radice < " (512)
13H 19 1 parola numero totale dei settori sul disco < " (non usato)
15H 21 1 byte ID del formato del dischetto < " (vedi tabella)
16H 22 1 parola numero di settori assegnati alla FAT< " (..
18H 24 1 parola numero di settori per traccia (bios)
1AH 26 1 parola numero di lati / testine (bios)
1CH 28 1 parola numero di settori speciali riservati (bios)
20H 32 5 byte N. totale settori (=Partition Table)
24H 36 2 byte n. drive fisico (su HD = 128)
26H 38 1 byte ID record avviamento (su HD = 29H
27H 39 4 byte n. di serie asseganto alla formattazione-
2BH 43 11 byte etichetta volume (comando label)
36H 54 8 byte ID file system (FAT16)
3EH 62 -- resto del programma di caricamento-


Tabella degli indicatori del formato del disco
capacitácodice esadecimaledescrizione
360 KbFDH 9 settori 40 tracce 512 bytes per settore
720 KbF9H 9 settori 80 tracce 512 bytes per settore
1.2 MbF9H 15 settori 80 tracce 512 bytes per settore
1.44 MbF0H 18 settori 80 tracce 512 bytes per settore
---- F8H disco fisso

NB: una parola è un gruppo di 2 byte (ogni byte è rappresentato da 2 cifre, in esadecimale) il cui valore più significativo è posposto al valore meno significativo ( in pratica si legge prima il secondo byte e poi il primo).


PARTITION TABLE

Nei dischi fissi il primo settore fisico si chiama Master Boot Record (MBR) e vi si trova la PARTITION TABLE, che contiene le informazioni necessarie per la identificazione delle dimensioni logiche dei dischi (o partizioni) ed un programma di boot capace di ricercare una partizione bootabile, di leggervi il boot sector e di trasferirgli il controllo. (Il boot sector vero e proprio, ovvero il programma di caricamento del sistema operativo, si trova all'inizio di ogni partizione bootabile).
La partition table può contenere al massimo quattro voci.


La tabella delle partizioni si trova alla fine del primo settore fisico del disco e contiene queste informazioni:
offset dimensioni descrizione
01BEH 16 bytes partizione n.4
01CEH 16 bytes partizione n.3
01DEH 16 bytes partizione n.2
01EEH
16 bytes partizione n.1
01FEH 16 bytes sigla AA55H (fine della tavola di partizione)


Le partizioni sono disposte in ordine inverso.
Ogni voce della tabella precedente contiene queste informazioni:

Informazioni contenute in ciascuna entry della tavola delle partizioni
noffset dalla prima vocedimensioni descrizione
1 00H 1 byte indicatore del boot
2 01H 1 byte testina iniziale 1
3 02H 1 byte settore iniziale 0
4 03H 1 byte cilindro iniziale 1
5 04H 1 byte indicatore del sistema
6 05H 1 byte testina finale valore bios -1
7 06H 1 byte settore finale valore bios
8 07H 1 byte cilindro finale valore bios -2
9 08H 4 bytes settore iniziale (rispetto all'inizio del disco) valore bios
10 0CH 4 bytes numero di settori della partizione (*)
(*) (n. faccia finale+1 * n. cilindro finale+1 * n. settori)-n. settori relativi

l'indicatore del boot è 00H in una partizione non bootabile e 80H in una partizione bootabile attiva. (Per attivare o disattivare una partizione si usa FDISK)

Gli indicatori del sistema sono:
HEXdescrizione
00H non noto
01H MS-DOS, FAT a 12 bit
02H MS-DOS, FAT a 16 bit
(*) (n. faccia finale+1 * n. cilindro finale+1 * n. settori)-n. settori relativi



FAT (File Allocation Table)

Nel secondo settore, il numero 1 si trova la FAT che inizia con il codice di identificazione del formato del disco (visto prima).
La voce successiva varia a seconda del tipo di FAT utilizzato, a 12 od a 16 bit.
Si troveranno i bytes FF FF nella seconda e terza posizione di una FAT a 12 bit; si troveranno o bytes FF FF FF nella seconda, terza e quarta posizione di una FAT a 16 bit.
La FAT occupa più settori ed in genere ne esiste una copia di riserva che viene continuamente aggiornata ma che non ha un uso pratico da parte del DOS, a parte il controllo delle corrispondenze dei dati tra le varie copie.
Per il suo uso in caso di danneggiamento della prima copia della FAT sono necessarie cognizioni avanzate o programmi specializzati.
La FAT contiene la mappa delle posizioni dei files all'interno del disco indicando quali cluster sono assegnati a ciascun file ed in quale ordine.
Per fare ciò nella directory, fra le informazioni relative a ciascun file, c'è l'indicazione del primo cluster dedicato a quel file.
Nella FAT c'è una corrispondenza 1 a 1 tra posizione nella FAT e numero di cluster.
In pratica vi è una tavola con una voce per ogni cluster dell'area dati del disco.
Il numero contenuto in ciascuna voce indica che il cluster corrispondente è libero od è occupato od è contrassegnato come difettoso.
Se il cluster è occupato, viene registrato il numero del cluster successivo appartenente al file e così via fino alla fine del file contrassegnato da un cluster con il codice FFFH oppure FFFFH a secondo del tipo di FAT.
Quando il file viene cancellato, le voci della FAT che contengono la catena dei cluster vengono portate a 0.
Il programma CHKDSK del DOS controlla l'integrità di queste catene (chain cluster).

Valore HEXDescrizione
AAH 55 fine boot record (il byte successivo è il primo della FAT, corrisponde allo ID del formato)
FFFH fine file per FAT a 12 bit
FFFFH fine file per FAT a 16 bit
FF7H cluster danneggiato per FAT a 12 bit
FFF7H cluster danneggiato per FAT a 16 bit
FF0H-FF6H riservato per FAT a 12 bit
FFF0H-FFF6H riservato per FAT a 16 bit
001H codice non utilizzato
00H cluster non utilizzato

La numerazione dei cluster nella FAT a 12 bit viene fatta utilizzando 1 byte e mezzo. Questo comporta una leggera complicazione per quanto riguarda l'esame della FAT.
In pratica, ricordando che le parole (ovvero 2 bit) si leggono in ordine inverso, e che prendiamo in esame solo 3/4 delle cifre che compongono la parola, leggeremo prima il secondo byte scartando la prima cifra, poi leggeremo il primo byte. Il nibble (mezzo byte) scartato verrà letto come parte del numero di cluster seguente, sempre seguendo il principio di leggere prima il secondi byte e poi il primo.

esempio di FAT a 12 bit

F9 FF FF 03 04 00 FF 0F 00

I primi tre bytes indicano il tipo di supporto magnetico ed il tipo di FAT. Dal quarto byte in poi c'è la mappa dei cluster.
Prendendo in esame i valori dei bytes, vediamo che il primo cluster è occupato da un file, che prosegue nel cluster 003H, 004, e termina (FFFH).
Infatti, il 3 e 4 byte contengono le cifre 03 e 04. Essendo una parola, si invertono le coppie si ottiene 04 03. La seconda cifra deve essere scartata in quanto ci servono soli 1 byte e mezzo. Rimane 003H, il numero del prossimo cluster della catena. Se continuiamo vediamo che ci è rimasto una cifra 4 e che il prossimo byte contiene il valore 00, cioè 4 00. Sempre per il concetto di parola invertiamo ed otteniamo 004H.
Il prossimo cluster della catena, continuando l'esame, è FFFH, ovvero l'ultimo della catena. Il cluster successivo è libero perché contiene il valore 000H.
Per la FAT a 16 bit nessun problema in quanto ogni coppia di byte indica un cluster.

Esempio di FAT a 16 bit
F9 FF FF FF 03 00 04 00 FF FF 00 00
ID Tipo di fat 16 bit cluster occupati ultimo cluster libero

Le dimensioni dei cluster possono creare qualche inconveniente. Siccome ogni cluster può essere adibito ad un solo file, se ho un file di 100 bytes ed una dimensione di cluster di 4096 bytes, io avrò uno spreco di 3996 bytes inutilizzati. Questo avviene anche se il cluster finale di un file non viene riempito completamente.
La mancanza di alimentazione su un computer può causare dei danni alla FAT od alla directory. Ecco una lista di possibili errori che possono causare anche gravi problemi nell'uso del PC.

mancanza di una voce della directory che rimandi ad una catena di cluster nella FAT. Questo può avvenire se il file non viene chiuso correttamente.
discordanza tra la lunghezza del file dichiarata dalla directory e l'effettiva lunghezza calcolata dalla catena dei cluster nella FAT.
una parte di una catena dei cluster è dichiarata fare parte contemporaneamente di due file (cross linked).
la catena dei cluster termina con un cluster libero e non con il codice di fine del file.
in un link viene riportato un numero di cluster al di fuori dei limiti.

I programmi come CHKDSK, NORTON DISK DOCTOR, SCANDISK, ed altri possono risolvere alcuni dei problemi presentati.


DIRECTORY

La root directory, o directory principale, contiene l'elenco dei files registrati sul supporto magnetico. Per ogni files vengono usati 32 bytes che contengono nome, estensione, data ed ora dell'ultima modifica, lunghezza, cluster iniziale, attributi.
Questa struttura è stata ereditata dal CP/M, il sistema operativo da cui ha tratto spunto MS-DOS.
Ogni posizione all'interno di questi 32 byte ha un preciso significato. Inoltre alcuni campi possono contenere dei valori particolari, mentre altri campi sono codificati per ottimizzare l'occupazione dello spazio.


I
Tabella campi per ogni entry della directory
campo offset descrizione dimensioni formato
1 0 nome del file 8 caratteri ASCII
2 8 estensione 3 caratteri ASCI
3 11 attributo 1 codifica binaria
4 12 riservato 10 contiene il valore 0
5 22 ora 2 parola, codificato
6 24 data 2 parola, codificato
726 voce iniziale FAT 2 parola
8 28 dimensioni 4 intero

Il campo 1 contiene il nome dl file, di 8 caratteri. Se il nome è più corto, vengono aggiunti degli spazi (carattere ASCII 32). Il nome viene scritto in maiuscolo, perché le minuscole non vengono riconosciute. Solo un parte del set di caratteri a disposizione può essere utilizzato nel nome del file. Non possono essere inseriti spazi all'interno del nome del file, anche se con opportuni accorgimenti è possibile utilizzare sia le minuscole che caratteri speciali ( ad esempio in BASIC). Nel primo byte del campo del nome possono trovarsi 3 codici:

valore descrizione
0 Voce di directory nulla. E' l'ultima voce della directory ed indica di non procedere nella ricerca
0E5H File cancellato
02EH Non è un file, ma una directory. Se anche il secondo byte è 02EH si tratta della directory di origine del presente indirizzario


Quando il file viene cancellato, il primo carattere del nome viene sostituito con il codice 0E5H e nella FATviene azzerata la catena dei cluster che lo compongono. Il DOS, quando crea un nuovo file, ricicla la prima voce cancellata che trova nella directory.
Il campo 2 contiene il suffisso del nome, di tre caratteri. Può contenere anche solo spazi. Quando la voce contiene il nome dell'etichetta del disco, i campi nome ed estensione vengono visti come un unico campo di 11 caratteri che può contenere anche spazi e lettere minuscole.
Il campo 3 contiene la codifica degli attributi del file. Convertendo il byte esadecimale in binario, ogni bit ad 1 identifica una caratteristica del file secondo la tabella

Tabella codifica attributi del file
bit 7 6 5 4 3 2 1 0 significato note
0 0 0 0 0 0 0 1 solo lettura se settato impedisce le modifiche del file
0 0 0 0 0 0 1 0 file nascosto non permette di vedere il file con DIR, etc.
0 0 0 0 0 1 0 0 file di sistema identifica i files di sistema ma non ha un uso particolare
0 0 0 0 1 0 0 0 etichetta volume se settato indica che si tratta dell'etichetta del disco
0 0 0 1 0 0 0 0 sub directory indica che si tratta di una subdirectory
0 0 1 0 0 0 0 0 archiviazione se a 1 indica che il file è stato modificato dopo l'ultimo backup. S è a 0 non ha subito modifiche
0 1 0 0 0 0 0 0 non usato
1 0 0 0 0 0 0 0 non usato


Il campo 4 è di 10 bytes a zero, riservati per usi futuri
I campi 5 e 6 contengono l'ora e la data di creazione del file o della sua modifica.

Il metodo per il calcolo dell'ora è il seguente:
-Prendere la parola che contiene l'ora. es. 43 4E
-Invertire i due byte. es. 4E 43
-Trasformare ciascun nibble in binario. es. 0100 1110 0100 0011 -Prendere le cifre in binario in gruppi, a partire da destra, rispettivamente di 5, 6, 5 bit. (es. 01001 110010 00011)
-Trasformare ciascun gruppo in decimale. es. 9 50 3
- Moltiplicate per 2 l'ultimo gruppo. es. 09: 50: 06
- Si sono ottenute l'ora, i minuti ed i secondi con una approssimazione di 2 secondi.

La formula inversa è: ORA=SECONDI/2+32*MINUTI+2048*ORE
trasformare il risultato in esadecimale ed invertire i byte per ottenere la parola.

Il metodo per il calcolo del giorno è il seguente:
-Prendere la parola che contiene i giorno. es. 65 08:
-Invertire i due byte. es. 08 65:
-Trasformare ciascun nibble in binario. es. 0000 1000 0110 0101 :
-Prendere le cifre in binario in gruppi, a partire da destra, rispettivamente di 7, 4, 5 bit.:
es. 0000100 0011 00101:
-Trasformare ciascun gruppo in decimale. es. 4 3 5:
- Aggiungere 1980 alla prima cifra . es. 1980+4 3 5 = 5 marzo 1984:
- Si sono ottenute l'anno, il mese ed il giorno.:

La formula inversa è:
-Prendere l'anno e sottrarre 1980
-Trasformarlo in binario ed aggiungere davanti tanti 0 quanti ne occorrono per avere un gruppo di 7 bit.
- Prendere il mese e trasformarlo in binario
- Prendere il giorno e trasformarlo in binario
- Leggere le cifre a gruppi di 4 bit e trasformarle in esadecimale
- Invertire le prime due cifre con le seconde due per ottenere la parola
:
[***formula da rivedere: (DATA=GIORNO+32*MESE+512*(ANNO-1980))***]

Il campo 7 contiene il numero di cluster iniziale del file, e serve per indirizzare l'inizio della catena di cluster nella FAT. Se il file ha lunghezza nulla e per etichette di volume contiene il valore 0:
. Per la voce '.' (punto, cioè la stessa directory) questo campo contiene il numero di cluster iniziale della directory stessa. Per la voce ' ..' (puntopunto, cioè la directory padre della stessa directory) contiene il valore 0 se si tratta della root directory, il numero di cluster iniziale se si tratta di una sottodirectory.

Formula per la trasformazione della numerazione sequenziale DOS in coordinate tridimensionali del ROM-BIOS

SETTORE.BIOS=1+NUMERO.DI.SETTORE.DOS MOD SETTORI.PER.LATO:
LATO.BIOS=(NUMERO.DI.SETTORE.DOS / SETTORI.PER.LATO) MOD LATI.PER.DISCO:
TRACCIA.BIOS=NUMERO.DI.SETTORE.DOS / (SETTORI.PER.LATO * LATI.PER.DISCO):