Un difetto del Block Mode (o Multi Sector Mode) e' che il Polled I/O avviene a interrupts disabilitati: questo perche' alcuni HD possono perdere dati se interrotti durante un PIO. Pertanto il ciclo avviene dopo aver dato un comando CLI (Disable Maskable Interrupts). Al termine, viene inviato il comando STI (Enable etc.). E tra i due comandi nessun interrupt viene generato, per cui mouse, tastiera e modem sono ciechi! Ecco un esempio di codice che implementa un trasferimento a blocchi (qui in lettura):
MOV CX,[BlockFactor] ; Block Factor e' il numero di settori trasferiti per interrupt MOV AX,100h ; Sector size espresso in words SHL AX,CL ; AX contiene il numero di words MOV CX,AX ; CX contiene il numero di words CLI ; ...senza mani! REP INSW ; Legge tutto in 1570 microsecondi (*) STI ; ...puff!
Naturalmente, e' possibile scrivere un codice piu' efficiente, es.:
MOV AX,[BlockFactor];
AGAIN: MOV CX,100h ;
CLI ; Disabilita gli interrupt per
REP INSW ; soli 100 microsecondi circa,ovvero
STI ; come se lavorassimo senza block
DEC AX ; mode !
JNZ AGAIN ;
Tuttavia, non e' raro trovare esempi del 1^ tipo ...
In 1570 microsecondi, a 14400 bps, arrivano circa 2.5 caratteri: troppi !
1.5 caratteri andranno persi, e la trasmissione via modem risultera' corrotta
(CRC ERROR, ZRPOS, LSR o altri errori ameni).
L'ovvio modo di rimediare (a parte abbassare la velocita' di connessione
del modem, che e' il modo suggerito da Telecom) e' ampliare il buffer di
ricezione. Per questo serve una seriale bufferizzata, o, se e' zoccolato
per benino, bastera' sostituire il vetusto chip 8250 o il fiero 16450 ed
acquistare un possente chip 16550A (che ha, appunto, un buffer integrato FIFO da 16 byte: piu' che
sufficiente
anche per velocita' ben superiori a 14400 bps !) e usare un programma, o un driver
o una utility che abbia la buona grazia di abilitare il buffer del chip,
se no serve a poco :-)
DMA MODE DURATA CICLO MAX TRANSFER RATE 0 900 ns 2.2 MB/s 1 480 ns 4.1 MB/s 2 240 ns 8.3 MB/s DMA MULTIWORD DURATA CICLO MAX TRANSFER RATE 0 480 ns 4.1 MB/s 1 150 ns 13.3 MB/s 2 100 ns 20 MB/s(per semplicita', e' stato assunto 1 MB = 1 milione di byte, anziche' 1^20 byte)
I modi DMA permettono quindi elevate velocita' di trasferimento e bassi carichi per la CPU; occorre tuttavia che il sistema operativo sia in grado di sfruttarli (servono, come sempre, i giusti driver); inoltre, non e' sufficiente che l'hard disk sia in grado di supportare il DMA: e' necessario che l'host adapter cui e' connesso sia in grado di operare come Bus Master, altrimenti il trasferimento DMA non potra' essere effettuato. Va infine ricordato che i valori di transfer rate riportati nella tabella vanno considerati come valori massimi durante un burst.
MOV CX,100h ; Numero di word da leggere: 1 settore = 512 byte = 256 words
CLI ; Vengono disabilitati gli interrupt per evitare possibili
; perdite di dati dovute ad interruzioni del ciclo PIO
REP INSW ; Vengono effettuate le 256 letture: il prefisso REP indica
; che l'istruzione che segue (INSW) va ripetuta CX volte
STI ; Gli interrupt vengono riabilitati
Nell'esempio fatto, abbiamo supposto che il Block Mode (vedi corpo principale dell'articolo "Uno sguardo al Setup -seconda parte"; vedi anche problemi
con il Block Mode) fosse disabilitato (1 solo settore trasferito per interrupt).
La velocita' con cui si susseguono le varie INSW determina, a conti fatti, il Transfer Rate per la lettura di un settore. Il protocollo d'intesa in via d'approvazione ATA-2 (che integra le specifiche ATA, EIDE e FAST-ATA) ha definito un certo numero di "modi", da PIO 0 a PIO 4, ciascuno caratterizzato da determinate durate del ciclo (e quindi capace di determinati T.R. massimi):
PIO MODE DURATA CICLO MAX TRANSFER RATE 0 600 ns 3.3 MB/s 1 383 ns 5.2 MB/s 2 240 ns 8.3 MB/s 3 180 ns (*) 11.1 MB/s 4 120 ns (*) 16.7 MB/s(per semplicita', e' stato assunto 1 MB = 1 milione di byte, anziche' 1^20 byte)
* Le specifiche per i cicli PIO 3 e 4 richiedono che sia il controller a temporizzare il ciclo, asserendo la linea IORDY quando la nuova word e' pronta per essere letta. Non tutti gli host adapter supportano questo controllo di flusso, percio' in alcuni casi non e' possibile superare il PIO 2, nonostante hard disk ed adapter siano "dichiarati" in grado di reggere temporizzazioni piu' rapide. Per contro, alcuni modelli di hard disk riescono a supportare il PIO 3 anche senza l'utilizzo del segnale IORDY.
I cicli PIO piu' veloci (3 e 4) prevedono che le istruzioni INSW si susseguano a ritmi elevati, il che ha delle
conseguenze piuttosto pesanti quando si utilizzi un sistema operativo multitasking.
Supponiamo infatti di avere un processore 486 DX2 66 e di voler utilizzare il modo PIO 4; l'esecuzione di
un'istruzione INSW all'interno di un ciclo REP richiede circa 60 ns, quindi il margine rispetto ai 120 ns
richiesti dal
PIO 4 e' troppo esiguo affinche' la CPU riesca a fare altro (il solo context switching necessario per far
subentrare
un altro processo richiederebbe ben piu' di 60 ns): questo significa che durante l'intero trasferimento del
settore (o
di piu' settori, se e' attivo il block mode) il sistema e' "congelato".
Cio' ha portato all'esigenza di definire delle nuove modalita' di trasferimento, piu' sofisticate del PIO
mode: sono i
modi DMA.