Quando si verifica una lettura del disco o la scrittura del disco, dove vanno i dati?


10

Capisco che esiste qualcosa come un controller del disco che contiene un buffer, ma mi chiedevo se la CPU legge direttamente da questo buffer o se i dati devono prima andare in una posizione specifica in memoria, e quindi lasciarsi leggere dalla CPU?

Qualcuno sa anche come si chiama il buffer? E come si inserisce DMA in tutto questo?

Risposte:


20

Per un disco letto il flusso di dati è essenzialmente:

  • dopo che l'assemblaggio di lettura / scrittura si trova sul cilindro richiesto, viene selezionata la testa di rotazione richiesta.
  • in ciascun settore viene letto l'ID settore. Se il numero di settore letto corrisponde al numero di settore richiesto, vengono letti i dati del settore.
  • i dati di settore vengono letti come un flusso di bit seriale e convertiti in byte.
  • i byte del settore sono memorizzati in un buffer di settore (solitamente SRAM nel controller); questo buffer di settore è distinto dalla "cache del disco".
  • una volta letto l'intero settore, i dati vengono convalidati utilizzando ECC e forse corretti.
  • una volta convalidati, i dati di settore vengono trasferiti dal controller al PC host. Nota: l'esistenza di questo buffer di settore non è ben nota e vi è una diffusa disinformazione secondo cui la velocità di trasferimento sull'interfaccia host (egATA) è legata o limitata dalla velocità in bit nell'head R / W. Ciò è completamente falso, poiché questi due trasferimenti di dati sono operazioni indipendenti e sequenziali e non simultanee.
  • poiché il PC riceve i dati dal controller del disco tramite l'interfaccia ATA, il PC può utilizzare l' I / O programmato (la CPU legge ripetutamente il registro dati della porta ATA e copia il valore nella memoria di destinazione) o DMA (il controller DMA è configurazione per copiare N byte dal registro dati della porta ATA in un buffer di memoria senza ulteriore intervento della CPU).
  • il "buffer" di memoria del PC che riceve i dati potrebbe essere il buffer dell'applicazione (quando si utilizza la chiamata di sistema I / O a blocchi ), oppure potrebbe essere un buffer di sistema interno sotto il controllo del filesystem o persino memoria del programma o dei dati se i dati provengono dallo swap area (o file di paging).

Una scrittura su disco è simile, tranne per il fatto che i dati vengono trasferiti dal PC al controller del disco, viene calcolato l'ECC, si trova il settore richiesto e quindi i dati vengono scritti dal buffer di settore sul piatto.

Per credito extra:

Leggi i trasferimenti " scatter-gather ", che utilizza il concatenamento DMA e un elenco scatter-gather di indirizzi di memoria e lunghezze del buffer. Invece di un buffer di memoria grande e contiguo, un trasferimento "scatter-gather" consente di aggregare l'uso di buffer di memoria non contigui per la richiesta di I / O del disco.


1
Potrebbe forse essere un po 'meno specifico riguardo alle "testine R / W" poiché i drive non meccanici vengono utilizzati molto più frequentemente in questi giorni, ma è una buona risposta.
Shinrai,

@Shinrai - Ho solo esperienza di programmazione diretta con unità disco a braccio mobile (e ho usato unità a testa fissa). Ho scelto di non speculare o ripetere informazioni di seconda o terza mano sul funzionamento degli SSD.
segatura,

+1 per questa grande risposta, ben documentata e scritta. Molto professionale.
climenole,

2

Va in un'area di memoria specifica che il kernel ha allocato il driver del disco. Non penso che sia chiamato in modo specifico. Quest'area di memoria è generalmente configurata come buffer ad anello . A seconda del sistema operativo, questa memoria può essere copiata una seconda volta nello spazio utente per l'applicazione da utilizzare.

DMA è "accesso diretto alla memoria", il che significa che il controller dell'unità disco può scrivere direttamente nella RAM senza che la CPU gli chieda ripetutamente se sono disponibili più dati (noti come polling - il modo in cui le cose venivano fatte). Invece, quando l'intero buffer è stato trasferito, il controller quindi interrompe la CPU per far sapere che i dati sono ora disponibili.

Se sei curioso di conoscere un livello ancora più basso, il driver effettua chiamate ioctl .


1
I buffer di suoneria sono in genere impiegati da dispositivi di rete (ad es. Controller Ethernet) perché i dati possono arrivare non richiesti (inaspettatamente senza una richiesta di lettura in sospeso). I dati da un'unità disco / controller sono sempre in risposta a una richiesta fatta dall'host. I dati sono richiesti, quindi non è necessario un "buffer ad anello" in un driver del disco.
segatura,

OK, ho lavorato solo con DAC a livello di driver e usano anche i buffer di anello, quindi avevo ipotizzato.
Aaron D. Marasco,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.