2014-03-19 11 views
11

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?

+0

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

+1

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 –

Antwort

1

Die Hotspot JVM (die Sie wahrscheinlich verwenden) verfügt über zwei Modi zum Ausführen von Java-Code: interpretiert und kompiliert. Wenn Sie ein Programm starten, wird es zuerst im interpretierten Modus ausgeführt. Wenn die JVM entscheidet, dass ein Codeblock oft genug ausgeführt wird, kompiliert sie ihn und verwendet den kompilierten Code.

Sie sollten also den linearen Trend in der Anzahl der ausgeführten Anweisungen sehen, aber solange die JVM im interpretierten Modus läuft, werden Sie nur Anweisungen vom Interpreter sehen, da es keinen Java-Code gibt.

Sind Ihnen die Leistungsindikatoren der x86-CPUs bekannt? Sie können verwendet werden, um die Anzahl der Anweisungen ohne Verwendung einer virtuellen Maschine zu messen. https://perf.wiki.kernel.org/index.php/Main_Page