Ich benutze QEMU-Emulator für die Verfolgung der Ausführung eines Benutzerprogramms. Wir haben eine Hilfsfunktion hinzugefügt, die die IP aller ausgeführten Anweisungen ausgibt. Wir haben die Funktionsweise dieses Tools für zwei Varianten des Primzahlprogramms getestet - eines in C und eines in Java. Wir probierten 4 verschiedene Eingabeargumente für jedes Programm aus und erwarteten eine unterschiedliche Anzahl von Anweisungen, die in jedem Fall ausgeführt wurden. Die C-Version des Primzahlprogramms folgt dem erwarteten linearen Trend, d. H. Die Anzahl der Zeilen steigt mit größeren Eingaben. Das Java-Programm gibt jedoch jedes Mal genau die gleiche Anzahl von Anweisungen.Qemu Benutzer-Emulation mit Java
Ich fühle, dass Java-Ausführung-Trace nur den JVM-Code erfasst und nicht den tatsächlichen Code, der ausgeführt wird.
Wo würde der von JVM modifizierte Code auf QEMU laufen? Gibt es eine spezielle Möglichkeit, wie QEMU die Ausführung von selbst modifizierendem Code erfasst?
Würdest du in der Lage sein zu skizzieren, wie du QEMU instrumentiert hast? (In der Vergangenheit habe ich etwas Ähnliches versucht, aber bei meinen ersten Versuchen konnte ich nur die erste IP jedes Übersetzungsblocks von QEMU sammeln, und nicht jede IP.) Wenn Sie Ihre Programme auf nativer Hardware programmieren, wird Ihr Java-Programm ebenfalls ausgeführt zeige die erwartete lineare Verlangsamung? – davidg
Qemu verwendet dynamischen Übersetzungsmechanismus. Er konvertiert den Gastblock in den nativen Block und speichert ihn im Code-Cache. Sie sollten den Verfolgemechanismus nicht im Übersetzungsteil hinzufügen. Generieren Sie stattdessen eine Hilfsfunktion, die für jeden Befehl aufgerufen wird. Während der Ausführung jedes Befehls wird eine Hilfsfunktion aufgerufen –