2010-02-22 13 views
13

Ho alcune domande sulle operazioni di sincronizzazione della cache.cache - flush e invalidate operation

Invalidate: Prima di cpu tenta di leggere una porzione di memoria aggiornata da un dispositivo, la memoria corrispondente deve essere invalidata.

Flush: Prima che il dispositivo legga una parte di memoria aggiornata dalla CPU, la CPU deve svuotare (anche la riscrittura è corretta?) Il contenuto dalla cache alla memoria, in modo che il dispositivo legga il contenuto dalla memoria con contenuti aggiornati.

Se a filo non viene effettuato, può leggere i dati spazzatura presenti nella memoria come la memoria non è ancora aggiornato con contenuti scritti nella cache.

Si prega di confermare se la mia comprensione di cui sopra è corretta?

Quando si desidera combinare sia flush che invalidate? Ho sentito che durante il gioco con i descrittori di controllo dei dispositivi dobbiamo sincronizzare combinando flush e invalidate. Perchè così?

abbiamo bisogno di seguire una sequenza come filo seguito da invalidate?

C'è uno scenario in cui invalidare seguita da incasso sarà utile?

+0

Grazie per tale spiegazione, non potrebbe trovare una spiegazione migliore di quella su internet .... – fazkan

risposta

21

Flush fa riscrivere il contenuto della cache per la memoria principale, e invalidare fa linee di cache marchio come non validi in modo che i futuri legge andare a memoria principale.

Penso che dovresti combinare flush e invalidare se il dispositivo stava aggiornando un blocco di memoria: lo svuotamento avrebbe assicurato che il dispositivo avesse gli ultimi contenuti, e l'invalidato avrebbe quindi assicurato che quando il dispositivo avesse finito che la CPU avrebbe leggi i nuovi contenuti dalla memoria.

+2

Aggiunta per chiarezza, Ciò avviene principalmente durante la fase di inizializzazione. I descrittori inizializzati sono entrambi Flushed (da aggiornare in memoria) e invalidato (So che la prossima letta dalla CPU è con contenuti utili) durante la fase di inizializzazione. – kumar

2

prega di confermare se la mia sopra comprensione è corretta?

In genere si ha perfettamente ragione ma ci sono alcune pietre che potrebbero causare inciampare. Non hai specificato la piattaforma HW. Se non stiamo parlando di piccoli controller embedded con w/SRAM, considerare quanto segue. I processori dotati di MMU supportano diversi attributi di memoria per la memoria DDR normale e la memoria del driver (relativa ad HW). L'ultimo non è memorizzabile nella cache, quindi non ci sono preoccupazioni per il flushing/invalidating.


Quando si desidera combinare sia a filo e invalidare? Ho sentito che durante la riproduzione con descrittori di controllo del dispositivo, dobbiamo sincronizzare combinando flush e invalidate. Perchè così?

Poiché DMA è menzionato in un tag ci sono alcuni scenari (supponendo che il buffer è HW memoria del dispositivo non-cacheable):

  1. trasferimento dati DMA dalla memoria DDR al buffer HW.
  2. DMA trasferisce i dati dal buffer HW a DDR (dati ricevuti HW e desidera renderli disponibili per la CPU)
  3. Trasferimento DMA da DDR in un'altra regione di DDR.


  1. tampone DDR dovrebbe essere arrossato prima DMA. Il buffer del driver non è memorizzabile nella cache, quindi non è necessario invalidarlo.
  2. tampone DDR dovrebbe essere invalidata prima o dopo (cercare NOTE sotto per i dettagli) DMA transfering per evitare CPU di utilizzare i dati 'vecchi' dalla cache. Il lavaggio del buffer HW è ridondante.
  3. tampone 'Source' deve essere lavata, buffer di 'Destination' dovrebbe essere invalidato. Quindi i dati validi sono in memoria per DMA prima del trasferimento e la CPU non prende una "sporcizia" dalla cache dopo che DMA ha fatto il suo lavoro.


NOTE: E 'ovvio che 'fonte' dovrebbe essere arrossato prima DMAing. Ancora c'è la questione quando invalidare. Tecnicamente è prima che la CPU proverà ad accedere ai dati "Destinazione" e potrebbe essere prima o dopo DMA (dovremmo assicurarci che DMA abbia completato il lavoro). IRL invalidando dopo DMAing potrebbe portare a un problema. Fare riferimento a Flush/Invalidate range by virtual address; ARMv8; Cache;

Come si può vedere invalidate per questa particolare piattaforma dovrebbe essere fatto prima di DMAing. Anche vagante °/il codice BSP per il dispositivo ARMv7 ho trovato raccomandazione di buffer di destinazione invalidate prima un trasferimento DMA.


abbiamo bisogno di seguire una sequenza come filo seguito da invalidate?

Supponendo che i buffer di origine e destinazione non si intersechino tra loro, non vi sono dipendenze. Potresti flush-invalidate o invalidate-flush.


C'è uno scenario in cui invalidare seguita da incasso sarà utile?

non la pensano così.