PROGRAMMAZIONE IN ASSEMBLY

Gestione del disco a basso livello

 


Questi file sono protetti dal diritto d'autore e sono liberamente
riproducibili a condizione di non farne uso comemrciale o economico o per
fine di lucro senza la preventiva autorizzazione dell'autore. In ogni caso
deve sempre essere indicato il nome dell'autore e il suo indirizzo. Ogni
altra modalita' di utilizzo deve considerarsi contraria alla volonta'
dell'Autore.


Negli anni ottanta un giovane signore di nome Peter Norton sorprese i suoi
amici recuperando un file cancellato, e questa piccola utility che prese il
nome di unerase lo rese famoso nel mondo della programmazione.
In questo tutorial vedremo come Š organizzato il file system del DOS, vedremo
come esso salva e cancella i file e impareremo ad usare alcune routine messe
a disposizione dal sistema operativo.


Tracce e settori

Un hard-disk Š costituito da un certo numero di dischi "impilati" uno sull'altro
a cui si accede per leggere e scrivere tramite un pettine di testine:

O I-----------
------------------- |
O I-----------
------------------- <==>|
O I-----------
------------------- |
O I-----------
------------------- |
/ O I-----------
/ \
disco \ testina

Ogni disco Š costituito da 2 facce, ogni faccia da n traccie e ogni traccia da
m settori.
Il settore Š l'unit… minima di informazione che puo' essere letta o scritta e
variano a seconda della capacit… del disco da 32 a 4096 byte (di solito sono
512); su ogni traccia ci sono da 4 a 32 settori e su ogni superficie da 20 a 1500
tracce.
Un settore Š composto da due parti: un numero di identificazione e l'area dei
dati.


Struttura fisica di un disco

Un disco fisso Š diviso in diverse aree che sono:

1.Boot Sector
2.FAT 1
3.FAT 2
4.Root directory
5.Data

Vediamoli uno a uno in dettaglio.

Boot Sector

Il boot sector Š situato sul primo settore del disco e contiene vari parametri
riguardanti il disco stesso, riporto di seguito la sua struttura:

BOOT STRUCT
bsJMP db 3 dup (?)
bsOEM db 8 dup (?)
bsSECTSIZE dw ?
bsCLUSTSIZE db ?
bsRESSECT dw ?
bsFATCNT bd ?
bsROOTSIZE dw ?
bsTOTALSECT dw ?
bsMEDIA db ?
bsFATSIZE dw ?
bsTRACKSECT dw ?
bsHEADCNT dw ?
bsHIDENSECT dd ?
bsHUGESECT dd ?
bsDRIVENUM db ?
bsRESERV db ?
bsBOOTSIGN db ?
bsVOLID dd ?
bsVOLABEL db 11 dup(?)
bsFILESTYPE db 8 dup(?)
BOOT ENDS

Vediamo cosa contengono:

- bsJMP: contiene un'istruzione di JMP al codice di BOOT che carica il Sistema
Operativo dal disco. Di solito il suo valore Š E9h,XX,XX

- bsOEM: Š un identificativo Original Equipment Manufacturer. Non Š usato dal
dos

- bsSECTSIZE: byte per settore

- bsCLUSTER: settori per cluster

- bsRESSECT: numero di settori riservati contiene di solito il numero di
settori fino alla prima FAT

- bsFATCNT: numero di FAT (di solito 2).Se ne usano due per poter recuperare
i dati nel caso una si danneggi

- bsROOTSIZE: massimo numero di voci in una directory

- bsTOTALSECT: numero di settori del drive o della partizione. Se la partizione
Š superiore a 32Mb, questo valore Š 0 la il numero di settori Š
specificato nel campo bsHUGESECT

- bsMEDIA: specifica il typo di drive FDD 3.5 1.44, FDD 3.5 2.88, CD-ROM, HD,
ecc...

- bsFATSIZE: numero di settori di una FAT

- bsTRACKSECT: settori per traccia

- bsHEADCNT: numero di testine per la lettura/scrittura

- bsHIDENSECT: numero di settori nascosti

- bsHUGESECT: numero di settore per dischi con capacit… superiore ai 32Mb

- bsDRIVENUM: 80h se Š il drive di boot, 0 altrimenti

- bsRESERV: non ancora usato (!)

- bsBOOTSIGN: 29h (??)

- bsVOLID: numero seriale del volume

- bsVOLABEL: etichetta del volume

- bsFILESTYPE: indica il tipo di file system :FAT12 o FAT16

Questa struttura Š seguita dal codice di boot che carica il S.O. e termina con
0AA55h.


FAT

Il DOS mappa lo spazio usando i Cluster non i settori e ogni cluster consiste
di un certo numero di settori consecutivi. Quando si crea un file il sitema
alloca una catena di cluster per il file, ci scrive dentro i dati e memorizza
le informazioni circa la locazione dei cluster nella File Allocation Table (FAT)
La FAT Š un array con elementi di 12 o 16 bit (dipende dal numero dei cluster),
i primi 3 byte (12bit) o 4 byte (16bit) sono riservati, per quanto riguarda il
resto riporto una tabella con i valori dei possibili elementi:

Valore Significato
----------------------------------------------------------------
(0)000h Cluster libero
(F)FF0h-(F)FF6h Cluster riservato
(F)FF7h Cluster danneggiato
(0)002h-(F)FEFh Cluster allocato, il numero Š quello del
prossimo cluster nella catena
(F)FF8h-(F)FFFh Ultimo cluster della catena

Quando il DOS crea un nuovo file o directory memorizza l'indice del primo
cluster nella directory destinazione all'offset 1Ah e allo stesso tempo questo
Š l'indice del primo elemento nella FAT. Il valore nella FAT indica il prossimo
cluster nella catena e cosi via fino all'ultimo cluster indicato con (F)FF8h-
(F)FFFh.
Vediamo un esempio.
Consideriamo un file (PIPPO.EXE) situato nella root directory e supponiamo che
inizi al cluster 04h. La struttura della FAT potrebbere essere questa:

indice 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D

Valore ID FFF 000 000 005 006 009 00A 000 FFF 00B FFF 000 000
^^^ ^^^ ^^^ ^^^
Quelli sottolineati sono i cluster del nostro file.


ROOT DIRECTORY

Qualsiasi disco ha una root directory ed eventualmente altre sotto-directory,
ogni dir Š un array di record.
La root directory Š memorizzata subito dopo la seconda FAT mentre le altre dir
sono trattate come normali file.
La struttura di un elemento della directory Š:

DIRENTRY STRUCT
deFILENAME db 8 dup(?)
deFILEEXT db 3 dup(?)
deATRIB db ?
deRESERV db 0Ah dup (?)
deTIME dw ?
deDATE dw ?
deCLUSTNUM dw ?
deFILESIZE dd ?
DIRENTRY ENDS

Vediamo il significato di ogni campo:
- deFILENAME: Contiene il nome del file. Il primo carattere pu• avere un
significato particolare:

Valore Significato
------------------------------------------------------------------
0 L'elemento non Š mai stato usato
05h Significa che il primo carattere del nome Š 0E5h (ASCII)
02Eh Se il resto di questo campo sono spazi (20h) allra il
campo deCLUSTNUM contiene il primo cluster della
directory. Se anche il secondo valore Š 02Eh e gli altri
sono spazi, il campo deCLUSTNUM contiene il primo
cluster della directory padre, oppure 0 se Š la ROOT dir
0E5h Questo file o directory Š stato cancellato (il resto del
nome rimane uguale)

- deFILEEXT: 3 caratteri che contengono l'estensione del file.

- deATRIB: Attributi del file:

7 6 5 4 3 2 1 0 bits
A D V S H R
| | | | | |_ 1 = Read only
| | | | |____ 1 = Hidden
| | | |_______ 1 = System
| | |__________ 1 = Volume label
| |_____________ 1 = Subdirectory
|________________ 1 = New or modified

- deRESERV: Riservato (!)

- deTIME: L'ora in cui il file Š stato creato o modificato l'ultima volta.
Il formato Š il seguente:
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
H H H H H M M M M M M S S S S S

- deDATE: Data in cui il file Š stato creato o modificato l'ultima volta.
Il formato Š il seguente:
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Y Y Y Y Y M M M M M M D D D D D

- deCLUSTNUM: Cluster iniziale della directory o del file.

- deFILESEIZE: dimensione del file in bytes


Ora che abbiamo visto come Š organizzato il disco vediamo alcune funzioni messe
a disposizione dal BIOS per accedere ai file presenti sul disco.
L'interrupt in questione Š il 13h e le sue principali funzioni ve le andate a
vedere su qualche technical reference.
Io vi riporto un programmino che...................


Per richieste, consigli, suggerimenti, aiuti, contributi, ecc...contattatemi

b0nu$,e-mail : bonus@numerica.it

TORNA INDIETRO