2010-02-22 2 views
13

Ich habe einige Fragen zu Cache-Synchronisationsoperationen.Cache - Leeren und Ungültigmachen der Operation

Invalidate: Bevor CPU versucht, einen Teil des von einem Gerät aktualisierten Speichers zu lesen, muss der entsprechende Speicher ungültig gemacht werden.

Flush: Bevor das Gerät einen Teil des von der CPU aktualisierten Speichers liest, muss die CPU den Inhalt aus dem Cache in den Speicher leeren (also zurückschreiben), so dass das Gerät den Inhalt mit aktualisierten Inhalten aus dem Speicher liest.

Wenn kein Flush ausgeführt wird, kann es Junk-Daten im Speicher lesen, da der Speicher nicht mit Inhalten aktualisiert wird, die in den Cache geschrieben wurden.

Bitte bestätigen Sie, ob mein oben genanntes Verständnis korrekt ist?

Wann möchten Sie sowohl Flush als auch Invalidate kombinieren? Ich habe gehört, dass wir beim Spielen mit Deskriptoren für die Gerätesteuerung synchronisieren müssen, indem wir flush und invalidate kombinieren. Warum?

Müssen wir einer Sequenz wie Flush gefolgt von Invalidate folgen?

Gibt es ein Szenario, in dem Invalidate gefolgt von Flush sinnvoll ist?

+0

Vielen Dank für eine solche Erklärung, könnte nicht eine bessere Erklärung als das im Internet finden .... – fazkan

Antwort

21

Flush schreibt den Inhalt des Cache in den Hauptspeicher zurück, und invalidate markiert Cache-Zeilen als ungültig, so dass zukünftige Lesevorgänge in den Hauptspeicher gehen.

Ich denke, Sie würden bündig und ungültig kombinieren, wenn das Gerät einen Speicherblock aktualisiert: die Flush würde sicherstellen, dass das Gerät den neuesten Inhalt hatte, und die Ungültigkeit würde dann sicherstellen, dass wenn die CPU fertig gewesen wäre lese den neuen Inhalt aus dem Speicher.

+2

Hinzufügen für die Klarheit, Dies wird hauptsächlich während der Initialisierungsphase durchgeführt. Die initialisierten Deskriptoren werden während der Initialisierungsphase sowohl geleert (um im Speicher zu aktualisieren) als auch invalidiert (so dass das nächste Lesen durch die CPU mit nützlichem Inhalt ist). – kumar

2

Bitte bestätigen Sie, ob mein oben genanntes Verständnis korrekt ist?

Im Allgemeinen sind Sie völlig richtig, aber es gibt einige Steine, die dazu führen könnten zu stolpern. Sie haben die HW-Plattform nicht angegeben. Wenn wir nicht von kleinen Embedded-Controllern sprechen, die mit SRAM gepackt sind, sollten Sie Folgendes beachten. Mit MMU gepackte Prozessoren unterstützen verschiedene Speicherattribute für normalen DDR-Speicher und Treiberspeicher (HW). Das letzte ist nicht cachefähig, so dass es keine Probleme mit dem Löschen/Ungültigmachen gibt.


Wann wollen Sie beide bündig kombinieren und entkräften? Ich habe gehört, dass während der Wiedergabe mit Gerätesteuerung Deskriptoren wir durch die Kombination von Flush und ungültig synchronisieren müssen. Warum?

  1. DMA-Übertragung von Daten von DDR-Speicher zu HW-Puffer

    :

Da DMA-Tags in einem erwähnt wird es einige Szenarien (unter der Annahme, dass HW Pufferspeicher nicht cachefähigen Gerät ist) sind.

  • DMA überträgt Daten vom HW-Puffer an DDR (HW empfängt Daten und möchte sie für die CPU verfügbar machen)
  • DMA-Übertragung von DDR in eine andere Region von DDR.

    1. DDR-Puffer sollte vor DMA gespült. Der Treiberpuffer kann nicht zwischengespeichert werden, so dass keine Invalidierung erforderlich ist.
    2. DDR-Puffer sollte vor oder nach ungültig sein (siehe NOTE unten für Details) DMA-Übertragung, um CPU zu verhindern, "alte" Daten aus dem Cache zu verwenden. Das Löschen des HW-Puffers ist redundant.
    3. 'Source' Puffer sollte geleert werden, 'Ziel' Puffer sollte ungültig gemacht werden. So befinden sich gültige Daten im Speicher für DMA vor der Übertragung, und die CPU nimmt keinen "Schmutz" aus dem Cache, nachdem DMA es getan hat.


    NOTE: Es ist offensichtlich, dass 'Quelle' sein sollte vor DMAing gespült. Immer noch ist die Frage, wann zu ungültig machen. Technisch gesehen ist es der Fall, bevor die CPU versucht, auf die Zieldaten zuzugreifen, und sie könnte vor oder nach dem DMA sein (wir sollten sicherstellen, dass DMA den Auftrag beendet hat). IRL ungültig nach DMAing könnte zu einem Problem führen. Siehe Flush/Invalidate range by virtual address; ARMv8; Cache;

    Wie Sie Invalidier für diese spezielle Plattform sehen könnten, sollten vor DMAing erfolgen. Auch der/die BSP-Code für ARMv7 Gerät Ich fand Empfehlung zu ungültig Zielpuffer vor eine DMA-Übertragung.


    Haben wir durch Invalidier eine Sequenz wie Flush gefolgt folgen müssen?

    Unter der Annahme, dass Quell- und Zielpuffer sich nicht überschneiden, gibt es keine Abhängigkeiten. Sie könnten flush-invalidate oder invalidate-flush.


    Gibt es ein Szenario, in dem durch bündig gefolgt INVALIDATE wird nützlich sein?

    Denke nicht.

    Verwandte Themen