Ultimo aggiornamento:Thursday 05 September 2002 | Visitatori dal 01 giugno 1999 |
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.
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:
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
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:
Per verificare quanto scritto prova a digitare i seguenti comandi dal prompt del dos
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
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
|
||||||||||||
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
|
||||||||||||
18 [2] | Data di creazione o aggiornamento del file
|
||||||||||||
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
|
||||
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
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