Perché una regione di memoria dovrebbe essere contrassegnata come non memorizzata nella cache?

StackOverflow https://stackoverflow.com/questions/90204

  •  01-07-2019
  •  | 
  •  

Domanda

In un'applicazione incorporata, abbiamo una tabella che descrive i vari intervalli di indirizzi validi sulla scheda di destinazione.Questa tabella viene utilizzata per impostare la MMU.
L'intervallo di indirizzi RAM è contrassegnato come memorizzabile nella cache, ma le altre regioni sono contrassegnate come non memorizzabili nella cache.Perché?

È stato utile?

Soluzione

Se si accede a una regione di memoria sia dall'hardware che dal software contemporaneamente (EX:registro di configurazione hardware o elenco scatter-gather per DMA), questa regione dovere essere definito come non memorizzato nella cache.Per il DMA effettivo, il buffer di memoria può essere definito come memorizzato nella cache e, nella maggior parte dei casi, è consigliabile che il buffer venga memorizzato nella cache per consentire un rapido accesso a quel buffer a livello di applicazione.È responsabilità del driver svuotare/invalidare la cache prima di passare il buffer al DMA o all'applicazione.

Piccolo aggiornamento, sopra dovere non è corretto nel caso in cui disponiamo di un hardware specializzato, ad es.Cache Coherency Interconnect (CCI) che sincronizzerà l'accesso di vari blocchi hardware alla memoria.

Altri suggerimenti

Questo viene fatto in modo che il processore non utilizzi valori obsoleti a causa della memorizzazione nella cache.Quando accedi alla RAM memorizzata nella cache (normale), il processore può "ricordare" il valore a cui hai avuto accesso.La prossima volta che guarderai la stessa posizione di memoria, il processore restituirà il valore che ricorda senza cercare nella RAM.Questa è la memorizzazione nella cache.

Se il contenuto della posizione può cambiare senza che il processore lo sappia, come potrebbe accadere se si dispone di un dispositivo mappato in memoria (ad esempio un FPGA che restituisce alcuni pacchetti di dati), il processore potrebbe restituire il valore "ricordato" dall'ultima volta, che sarebbe sbagliato.

Per evitare questo problema, contrassegna lo spazio degli indirizzi come non memorizzabile nella cache.Ciò garantisce che il processore non tenti di ricordare il valore.

Qualsiasi regione di memoria utilizzata per DMA o altre interazioni hardware non deve essere memorizzata nella cache.

Forse è usato per l'I/O mappato in memoria?

Alcune aree come Flash possono essere lette in un ciclo, quindi non è necessario memorizzarle nella cache.

I controller moderni possono utilizzare la cache L2 per DMA, il che significa che preservano la coerenza della regione di memoria memorizzata nella cache utilizzata per gli accessi DMA.Questo è anche definito come "transazioni di memoria snoopable" eseguite dal controller (tramite DMA).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top