Wie klar und ungültig ARM v7 Prozessor-cache vom User-Modus auf Linux 2.6.35
Habe ich versucht klar und ungültig ARM v7-Prozessor-Caches für Instruktion Linie, weil instruction-codes ändern kann in der Ausführung.
Für das erreichen der Wirkung, versuchte ich 2 Varianten. Hier sind Sie:
-
Ich GCC __clear_cache () - Funktion, aber es hat nicht ein gefordertes Ergebnis. Instruction codes im cache hat sich auch nicht geändert.
-
Suchte ich einen Quellcode für GCC und fand die uclinux-eabi.h-Datei gefunden, wo ich den nächsten code für das clearing-cache:
/* Clear the instruction cache from `beg' to `end'. This makes an inline system call to SYS_cacheflush. */ #undef CLEAR_INSN_CACHE #define CLEAR_INSN_CACHE(BEG, END) \ { \ register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ register unsigned long _end __asm ("a2") = (unsigned long) (END); \ register unsigned long _flg __asm ("a3") = 0; \ register unsigned long _scno __asm ("r7") = 0xf0002; \ __asm __volatile \ ( \ "swi 0x0 @ sys_cacheflush" \ : "=r" (_beg) \ : "0" (_beg), "r" (_end), "r" (_flg), "r" (_scno)); \ }
Diese Variante nicht geben, das Ergebnis zu.
Weiss jemand vielleicht was ich falsch mache ?
- Ich würde schauen, dass der compiler ist eigentlich ehrt Ihre Anfrage zur Verwendung der angegebenen register (a1, a2, a3, r7) durch dumping die generierte Objekt-Datei als Montage. Du bist wohl am Ende mit der falsche Register verwendet wird, der für die kernel-Aufruf (swi).
- Wie ich es verstehe, ist dies der empfohlene Weg, um asm-Eingänge in bestimmte register, weil es nicht bestimmte Einschränkungen für die einzelnen Register 🙁 stackoverflow.com/q/37358451/224132
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte ein ähnliches problem selber. __clear_cache() funktioniert, aber nur wenn der Speicherbereich in Frage zugewiesen wurde mithilfe von mmap() mit PROT_EXEC gesetzt. Linux wird nicht flush instruction cache, wenn Sie es mit einer Speicher-Bandbreite, das kommt vom regelmäßigen malloc()ed") Speicher, auch wenn der Prozessor scheint glücklich zu sein, um die Ausführung von code von malloc()ed-Speicher.
Sehen https://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code für Beispiel-code, wie dies zu tun.