In einer eingebetteten Anwendung haben wir eine Tabelle, die die verschiedenen Adressbereiche beschreibt, die auf der Zieltafel gültig sind. Diese Tabelle wird zum Einrichten der MMU verwendet.
Der RAM-Adressbereich ist als cachefähig gekennzeichnet, andere Regionen sind jedoch als nicht cachefähig gekennzeichnet. Warum ist das so?
Wenn auf eine Speicherregion gleichzeitig sowohl von Hardware als auch von Software zugegriffen wird (EX: Hardwarekonfigurationsregister oder Scatter Gather List für DMA), muss diese Region als nicht zwischengespeichert definiert werden. Für den tatsächlichen DMA kann der Speicherpuffer als zwischengespeichert definiert werden, und in den meisten Fällen ist es ratsam, den Puffer zwischenzuspeichern, um dem Anwendungspegel einen schnellen Zugriff auf diesen Puffer zu ermöglichen. Es liegt in der Verantwortung des Treibers, den Cache zu leeren / ungültig zu machen, bevor der Puffer an DMA oder die Anwendung übergeben wird.
Dies geschieht, damit der Prozessor aufgrund des Caching keine veralteten Werte verwendet. Wenn Sie auf (normalen) zwischengespeicherten RAM zugreifen, kann sich der Prozessor den Wert merken, auf den Sie zugegriffen haben. Wenn Sie das nächste Mal auf denselben Speicherort schauen, gibt der Prozessor den Wert zurück, an den er sich erinnert, ohne in den Arbeitsspeicher zu schauen. Dies ist Caching.
Wenn sich der Inhalt des Standorts ändern kann, ohne dass der Prozessor dies bemerkt, wie dies bei einem Speichergerät der Fall sein könnte (ein FPGA gibt zum Beispiel einige Datenpakete zurück), könnte der Prozessor den zuletzt gespeicherten Wert zurückgeben Zeit, die wäre falsch.
Um dieses Problem zu vermeiden, markieren Sie diesen Adressraum als nicht zwischenspeicherbar. Dies stellt sicher, dass der Prozessor nicht versucht, sich an den Wert zu erinnern.
Moderne Controller können L2-Cache für DMA verwenden, was bedeutet, dass sie die Kohärenz des zwischengespeicherten Speicherbereichs für DMA-Zugriffe beibehalten. Dies wird auch als "Snoop-fähige Speichertransaktionen" bezeichnet, die vom Controller (über DMA) ausgeführt werden.