Torna alla Home page.

File system del Dos & Windows

Torna alla Home page.

 

Indice:

  1. Introduzione
  2. Boot Master Record
  3. Boot Sector
  4. FAT16 & FAT32
  5. Directory (Root)
  6. File & Directory

 

Ultimo aggiornamento:Thursday 05 September 2002 CounterVisitatori dal 01 giugno 1999

 

Introduzione:

In questa pagina desidero condensare tutto quello che ho trovato e sperimentato riguardante la gestione dell'HD bypassando il sistema operativo, dunque al più basso livello possibile.

Ho iniziato questa ricerca inizialmente per curiosità e successivamente, viste le conoscenze acquisite, per realizzare un progetto valido per il corso d'esame di Informatica Industriale che verte nel realizzare le primitive per il supporto del disco in il sistema operativo Real Time HARTIK scritto dal mio professore.

Il documento cerca di spiegare come siano strutturate le informazioni sull'HD che in breve può essere diviso in cinque aree:

MBR (Master Boot Record)
Boot Sector
Partizione 1
Boot Sector
Partizione 2
Boot Sector
Partizione 3
Boot Sector
Partizione 4
FAT1 /FAT2 FAT1 /FAT2 FAT1 /FAT2 FAT1 /FAT2
Root Root Root Root
Dati Dati Dati Dati

Nel seguito saranno descritte le varie parti.

Master Boot Record:

Il MBR è il primo settore dell'HD (Il settore 1 del cilindro 0 sotto la testina 0 oppure il settore 0 nella numerazione LBA) e contiene il codice che esegue le prime operazioni di boot (Dal byte 0 al 1DD cerca la partizione da avviare e se c'è lancia il boot sector) e la tabella delle partizioni (Al massimo possono essercene 4 "primarie").

Routine d'avvio da 0 a 1BD
Partizione 1 da 1BE ad 1CD
Partizione 2 da 1CE ad 1DD
Partizione 3da 1DE ad 1ED
Partizione 4da 1EE ad 1FD
Codice di fine MBR 55 AA

I sedici byte di ciascuna partizione sono utilizzati in questo modo:

BOOT Testina Settore Cilindro
SYS Testina Settore Cilindro
Primo settore (LBA)
Numero di settori della Partizione

Il primo byte BOOT contiene 80H se la partizione è avviabile altrimenti contiene 0.
Il secondo, terzo e quarto byte contengono le coordinate "fisiche" del primo settore della partizione (Boot Record) ma occorre notare due cose:

  1. I bit 6 e 7 del byte Settore sono i due bit più significativi del Cilindro che dunque è un dato a 10 bit.
  2. Il numero di settori indirizzabili con questa rappresentazione è limitato a 8bit+6bit+10bit=24bit quindi circa 16M settori dunque 4G byte, quantità ormai superata dagli HD attuali ... dunque e meglio usare la LBA.

Il quarto byte SYS contiene informazioni sul sistema operativo che ha creato la partizione.
Il quinto, sesto e settimo byte contengono le coordinate "fisiche" dell'ultimo settore della partizione.

I quattro byte successivi indicano la posizione del primo settore della partizione rappresentando il disco come una sequenza lineare di settori (LBA Logical Block Adress) a partire da 0 = MBR.
Gli ultimi quattro byte indicano il numero di settori occupati dalla partizione.

Per verificare quanto scritto prova a digitare i seguenti comandi dal prompt del dos

Boot Sector:

Ogni partizione inizia con un settore preposto a contenere informazioni sull'unità, e sul file system implementato nonché ad avviare il sistema operativo (Se la partizione è avviabile e contiene il file IO.SYS e MSDOS.SYS).

Il settore di Boot contiene parecchie informazioni ma le più importanti sono:

03H [8] Stringa contenente la versione del Sistema operativo
0BH [w] Numero di byte per ogni settore
0DH [b] Numero di settori per ogni cluster
0EH [w] Numero di settori riservati (Sono tutti quelli tra il BR e la FAT1)
10H [b] Numero di FAT (In genere ce ne sono due copie per sicurezza)
11H [w] Massimo numero di file memorizzabili in Root (Con la FAT32 non ci sono limiti dunque questo campo è nullo)
16H [w] Numero di settori utilizzai per memorizzare la FAT16
18H [w] Numero di settori per cilindro.
1AH [w] Numero di testine
24H [d] Numero di settori utilizzati per memorizzare la FAT32

Due osservazioni:

  1. La word in 11H indica quanti file possono essere memorizzati in Root.
    Fino all'introduzione della FAT32, infatti, LA directory (Root) era dimensionata fin dalla formattazione dunque il numero di file che poteva contenere era limitato.
    Successivamente si è deciso di trattare la directory come tutte le altre; questo però ha modificato il modo in cui si gestisce il file system.
    Mentre con la FAT16 il cluster 2 è il primo cluster dopo la directory, con la FAT 32 il primo cluster utilizzabile (che è sempre il numero 2 visto che i primi due (0 e 1) sono comunque riservati) è quello che segue l'ultima copia della FAT e in generale contiene la prima parte della Root ma contrariamente a quanto accade nella precedente versione non è detto che sia seguita dal resto della Root che per essere letta deve essere raggiunta facendo uso della FAT come per qualunque altro file.
  2. Un'altra differenza sostanziale tra FAT16 e FAT32 sta nel fatto che la FAT32 ha dimensioni molto variabili e per grossi HD è anche molto grande dunque non basta la word 16H per memorizzarne le dimensione ecco perché per la FAT32 sono stati usati 4 byte a partire da 24H.

Per verificare quanto scritto prova a digitare i seguenti comandi dal prompt del dos

FAT16 & FAT32:

La FAT è una tabella in cui sono registrate tutti i concatenamenti di cluster necessari a ricostruire un file.

Facciamo un passo indietro e vediamo il motivo per cui c'è bisogno di una FAT.

NB: i primi due valori (0 e 1) della FAT sono riservati dunque il primo cluster utilizzabile è il 2.

00000000 000010A3 000010A4 000010A5
000010A6 0FFFFFF8 00000000 0FFFFFF8
00000000 0FFFFFF0 00000000 0FFFFFF7

Il primo cluster dell'esempio è il n° 010A1H ed è libero.
Il secondo cluster è il primo di un File e c'informa che il successivo si trova nella posizione 010A3H che ci dice che il successivo è nella posizione 010A4H ... fino alla 010A6H dove si trova il codice di fine file 0FFFFFF8
Nella posizione 010A8H troviamo un altro file che questa volta è piccolo e quindi occupa solo questo cluster.
Infine nelle posizioni 010AAH e 010ACH ci sono due codici speciali, il primo indica la presenza di un cluster riservato mentre il secondo indica che quel cluster è danneggiato.

Dunque:

FAT16

 

FAT32

0000 Cluster libero   00000000 Cluster libero
FFF0/6 Cluster riservato   0FFFFFF0/6 Cluster riservato
FFF7 Cluster danneggiato   0FFFFFF7 Cluster danneggiato
FFF8/F Cluster di fine file   0FFFFFF8/F Cluster di fine file

OSSERVAZIONE: Nella FAT32 in realtà vengono utilizzati solo 28bit.

Per verificare quanto scritto prova a digitare i seguenti comandi dal prompt del dos

Directory:

Come ho già detto la Root viene gestita diversamente a seconda che la FAT sia a 16 o 32 bit.

FAT16:

La directory comincia subito dopo l'ultima copia della FAT e occupa settori consecutivi per un'estensione definita nel BS dalla cella 11H (Ogni file occupa nelle directory 32 byte dunque basta fare i conti).

FAT32:

La directory comincia subito dopo l'ultima copia della FAT ma per essere letta completamente occorre seguire i concatenamenti indicati nella FAT come per ogni altro file.

I dati dei file sono memorizzati nelle directory in questo modo:

00 [8+3] Nome file (8 bit) + Estensione (3 bit)
0B [1] Attributo del file
bit 0 Sola lettura
bit 1 File nascosto
bit 2 File di sistema
bit 3 Label di volume
bit 4 Directory
bit 5 File archivio
0C [8] Riservati (Servono per la FAT32 ma non so a cosa)
14 [2] Parte alta del primo cluster del file (Per FAT32)
16 [2] Ora di creazione o aggiornamento del file
bit 0/4 Secondi /2
bit 5/10 Minuti
bit 11/16 Ore
18 [2] Data di creazione o aggiornamento del file
bit 0/4 Giorni
bit 5/8 Mesi
bit 9/16 Anni-1980
1A [2] Parte bassa del primo cluster del file (FAT 16/32)
1C [4] Dimensione del file in byte

I nomi lunghi vengono gestiti da W95 memorizzando nella directory una struttura del tutto analoga a quella appena descritta preceduta da uno o più blocchi della stessa dimensione che contengono il nome completo.

Blocco di 32 byte che contiene l'ultima parte del nome lungo
Blocco di 32 byte che contiene una parte del nome lungo
Blocco di 32 byte che contiene la prima parte del nome lungo
Descrittore del file come descritto sopra
(Nome ed estensione nel formato standard 8.3)

Per mantenere la compatibilità con gli OS precedenti i programmatori della Microsoft hanno sfruttato il fatto che questi (DOS e WIN3.1) interpretano l'attributo del file (0Bh nel descrittore del file) 0Fh saltando il blocco, come se non ci fosse.
Dunque la compatibilità verso il basso viene assicurata semplicemente inserendo, prima della struttura dati che rappresenta il file scritto nel formato "short (8.3)", dei blocchi da 32 byte che riportano come attributo il valore 0F e nei restanti byte le informazioni sul nome lungo.

In realtà le cose sono leggermente più complicate infatti:

Riporto ora la struttura che viene utilizzata per implementare la gestione dei nomi lunghi dei file in W95.

00 [1] Contatore/Marcatore EndOfLongFileName
bit 0/4 Numero del blocco
bit 6 1=Ultimo blocco
01 [A] Cinque caratteri in formato UNICODE
0B [1] Attributo del file (Deve essere 0Fh)
0C [1] 0
0D [1] Check sum
0E [C] Sei caratteri in formato UNICODE
1A [2] 00 00
1C [4] Due caratteri in formato UNICODE

Il byte (0D) contiene la Check sum che permette al sistema operativo di verificare se il/i blocchi che precedono quello standard (Short a 8.3) sono quelli che contengono il suo nome lungo.
Il calcolo della Check sum vene eseguito con questa funzione:

#define UCHAR unsigned char

/* nome punta ai byte 00--0A del blocco del file in formato short (8.3) */
UCHAR Checksum(UCHAR* nome)
{
     UCHAR cont;
     UCHAR sum;

     for (sum=0, cont=0; cont<11; cont++){
          sum = (((sum & 1) << 7) | (( sum & 0xFE)>>1)) + (*nome);
          nome++;
     }
     return(sum);
}

Esempio di struttura dati per la gestione di un LongFileName.

NB: Quando un file viene cancellato viene inserito il codice 0E5H come primo carattere del nome.

Per verificare quanto scritto prova a digitare i seguenti comandi dal prompt del dos

File & Directory:

Una volta guadagnato l'accesso alla Root è possibile accedere ai file o alle altre directory tramite il primo cluster del file memorizzato nella posizione 1AH per la FAT16 e nella posizione 14H : 1AH per la FAT32.

Due osservazioni:

Il campo 1CH (Dimensione del file) della struttura dati che memorizza le informazioni del file è necessario per leggere nel cluster solo le informazioni del file e non tutto il cluster (Es: se il cluster è grande 4K ed il file solo 1K gli altri 3K non vanno letti)

Per commenti, aggiunte, correzioni o altro contattatemi

 


Torna alla Home page
Torna all'inizio
Prossimo progetto
1 1