2016-05-19 13 views
0

I den folgenden Code bin mit einer Cache-Zeile auf einem Himbeer pi spülen 2:vom Benutzermodus auf ARMv7 (rpi2)

static inline void flush(void addr) 
{ 
    asm volatile("mcr p15, 0, %0, c7, c6, 1"::"r"(addr));            
} 

ich eine Störung erhalte, dass dies ein privilegierter Befehl ist, wenn ich das mache. Ist dieser Code korrekt? Gibt es eine Möglichkeit, die Cache-Zeile aus Benutzerbereich auf diesem Computer zu löschen? Auf x86 clflush funktioniert ohne jede Änderung.

+0

Bezogen: [Cache auf DRAM flush] (http://stackoverflow.com/questions/18896812/flush-cache-to-dram). Es gibt zwei Ebenen des Caches, L1 und L2, und beide benötigen unterschiedliche Mechanismen zum Leeren (und Ungültigmachen). In der Regel sind diese nur aus einem Supervisor-Modus zulässig, sodass Ihr Betriebssystem einen Mechanismus bereitstellen muss. –

Antwort

2

Ist dieser Code korrekt?

In der Tat, nein. Das ist eine falsche, nicht existierende Systemregistercodierung - Cache-Wartungsoperationen leben im c7-Raum, nicht in c12.

Was noch mehr falsch ist, ist die Annahme, dass Sie dies tun können. Vor ARMv8 können alle Cache-Wartungsvorgänge nur in privilegierten Modi ausgeführt werden. Im Benutzerbereich benötigen Sie Unterstützung vom Betriebssystem, damit Sie es anfordern können. Linux zum Beispiel hat einen ARM-spezifischen syscall, dem GCC eine Schnittstelle zu __clear_cache() - there might be some permission-related caveats bietet, obwohl ich keinen Verweis auf VMA-Berechtigungen in the current mainline kernel code sehe, also vielleicht war es eine Eigenart älterer Kernel.

In beiden Fällen ist die einzige Ursache für die Cache-Wartung, die wirklich für den Userspace-Code gilt, die Kohärenz zwischen den Befehls- und Datencaches, um JITs oder selbst modifizierenden Code zu berücksichtigen. Dinge wie die Datencache-Kohärenz mit dem Hauptspeicher sollten niemals für den Benutzerraumcode relevant sein (der normalerweise in Treibern innerhalb des Betriebssystems aufgerufen würde, wenn solche Dinge wichtig wären) und auf vielen Systemen eine separate äußere Cachewartung erfordern, die nur das OS ist in der Lage, trotzdem zu verwalten.

+0

Sie haben Recht. c12 soll c7 sein. Ist der Code korrekt, wenn ich ihn in c7 ändere? – sanatana

+0

Der angegebene Link erwähnt, dass Sie den Cache nur löschen können, wenn er mmapiert ist. Also gibt es kein Äquivalent zu Clflush auf ARMv7? – sanatana

+0

Sie müssen (sollten) 'mmap' oder' mprotect' Seiten haben, um sie sowohl schreibbar als auch ausführbar zu machen, wenn Kohärenz zwischen Befehls- und Datencaches wichtig wird; Die Pflege des Userspace-Caches ist wirklich nur für selbstmodifizierende Code-/JIT-Fälle vorgesehen (d. h. sauberen Dcache bis zur Vereinigung, Icache ungültig machen). Dieser korrigierte Befehl würde den Datencache invalidieren (d. H. Potenziell verschmutzte Daten wegwerfen), was für ein Benutzerraumprogramm keinen Sinn ergibt, selbst wenn es möglich wäre. – Notlikethat