Flush cache-DRAM
Ich bin mit einem Xilinx Logistiksoftware von TRANSDATA jetzt Plattform mit einem Bereich der Speicher gemeinsam von der programmierbaren Hardware und der ARM-Prozessor.
Habe ich reserviert, dieser Speicher mit memmap auf der kernel-Kommandozeile und dann ausgesetzt, die es zu userspace via mmap/io_remap_pfn_range Anrufe in meinem Treiber.
Das problem das ich habe ist, dass es dauert einige Zeit, der schreibt, um zu zeigen, bis in DRAM-und ich vermute, es stecken in dcache. Es gibt eine Reihe von flush_cache_* Anrufe definiert, aber keiner von Ihnen exportiert werden, die einen Anhaltspunkt für mich, dass ich auf dem Holzweg...
Als Testversion, die ich lokal exportiert flush_cache_mm und nur um zu sehen, was passieren würde, und keine Freude.
Kurz gesagt, wie kann ich sicher sein, dass jeder schreibt zu diesem mmap würd Regionen begangen wurden, zu DRAM?
Dank.
- memory.txt zeigt die Arten von Speicher zur Verfügung, die von Linux-kernel-space. Diese Speicher-Optionen können Sie besser dienen als die memmap-Befehlszeile. Sie behandeln können Kommandozeilen-Argumente in einen Treiber.
- Möglich, Duplikat der Wie Spülen Sie die CPU-cache-für eine region Adressraum in Linux?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ARM Prozessoren haben in der Regel sowohl eine I/D-cache und ein write buffer. Die Idee einer write buffer ist gang sequentiell schreibt zusammen (ideal für synchronous DRAM) und keine Verzögerung bei der CPU warten, bis eine schreiben abgeschlossen.
Werden generic, können Sie Spülen Sie die d-cache und die write buffer. Die folgenden ist einige inline - ARM assembler, das sollte funktionieren, für viele Architekturen und Speicher-Konfigurationen.
Müssen Sie möglicherweise mehr, wenn Sie haben eine L2-cache.
Antwort in einem Linux-Kontext gibt es verschiedene CPU Varianten und verschiedene Routinen je nach Speicher/MMU-Konfigurationen und sogar CPU-errata. Siehe zum Beispiel
Diese Routinen sind entweder direkt aufgerufen oder blickte in ein cpu-info Struktur mit Funktionszeigern auf die entsprechende routine für die CPU erkannt und Konfiguration, je nachdem, ob der kernel ist besonderen Zweck, für eine einzelne CPU oder multi-purpose wie ein Ubuntu-distribution.
Um die Frage zu beantworten, die speziell für Ihre situation können, müssen wir wissen L2-cache, schreiben gepuffert Speicher, CPU-Architektur Besonderheiten; vielleicht einschließlich Silizium-Revisionen für errata. Eine andere Taktik ist, vermeiden Sie diese vollständig mit der
dma_alloc_XXX()
- Routinen die Marke Speicher als un-cacheable und un-bufferable, so dass die CPU schreibt geschoben werden extern sofort. Je nach memory access pattern, entweder gültige Lösung. Sie darf möchten cache ist der Speicher muss nur synchronisiert an irgendeinem checkpoint (vsync/*hsync* für video, etc).v7_flush_dcache_all()
in cache-v7.S möglicherweise besser geeignet für einen Cortex-A9. Die driver müsste einen Mechanismus, um flush von user-space, wie einioctl()
Befehl, oderproc
odersysfs
- Datei-Einträge. Danke, ich dachte, das war offensichtlich, und es ist wahrscheinlich nicht.Ich bin nicht vertraut mit Logistiksoftware von TRANSDATA jetzt, aber Sie im wesentlichen zwei Optionen, die wirklich funktionieren:
Wenn der Speicher is marked as cacheable und Ihr anderen Beobachter nicht in der gleichen Kohärenz Domäne, die Sie für Probleme Fragen - bei der Reinigung der D-cache mit einer DCCISW oder ähnliche op und Sie haben eine L2-cache - das ist, wo es ' ll alle am Ende in.
Traf ich genau das gleiche problem, auf Logistiksoftware von TRANSDATA jetzt. Schließlich bekam L2 gespült/entwertet mit:
start eine kernel-virtual space Zeiger. Sie müssen auch flush L1 zu L2:
Ich bin mir nicht sicher, ob ungültig L1 ist erforderlich, bevor Sie zu Lesen, und ich habe nicht gefunden die Funktion, dies zu tun. Ich nehme an, es würde sein müssen, und ich habe bisher nur Glück...
Scheint irgendwelche Vorschläge auf der 'net, die fand ich davon aus, das Gerät sei "inside" von den L2-cache-Kohärenz, so dass Sie nicht funktionieren, wenn die AXI-HP-ports verwendet wurden. Mit dem AXI-AKP-port, L2 Spülung war nicht notwendig.
(Für diejenigen, die nicht vertraut mit zync: die PS-ports Zugriff auf den DRAM-controller direkt, unter Umgehung jeglicher cache/MMU implementiert, die auf der ARM-Seite)