Ich versuche, alle Ebenen des Cache für meine Maschine Intel (R) Xeon (R) CPU E5-1650 v2 @ 3,50 GHz in Xen zu deaktivieren. Ich habe ein Tool geschrieben, um den folgenden Assemble-Code aufzurufen, um den Cache zu deaktivieren / aktivieren und den Wert des CR0-Registers anzuzeigen.
%Vor%Der Code kann kompiliert und ausgeführt werden. Nachdem ich den Deaktivierungs-Cache-Code ausgeführt habe, wird das System extrem langsam, was bestätigt, dass der Cache deaktiviert ist. Außerdem zeigt der Wert von CR0, dass das CD-Bit gesetzt ist, wenn ich den Deaktivierungs-Cache-Code ausführe.
Allerdings, wenn ich den Show-Cache-Code ausführe, zeigt die Ausgabe an, dass das CD-Bit von CR0 0 ist, egal, ob ich den Cache deaktiviere / aktiviere.
Meine Frage ist:
Wird das CD-Bit (30bit) des CR0-Registers immer auf 1 gesetzt, wenn der Cache deaktiviert ist?
Wenn nicht, muss etwas mit meinem Code nicht stimmen, können Sie mir bitte helfen, auf den Fehler hinzuweisen, den ich gemacht habe?
ANTWORT:
Der obige Code setzt nur das CD-Bit des Registers CR0 auf dem Kern, auf dem der Code ausgeführt wird. Wir müssen die smp_call_function () verwenden, um den Code auf allen Kernen aufzurufen!
Meine neue Frage ist:
Wenn ich den Cache deaktiviere und dann den Cache mit dem obigen Code aktiviere, wird das CD-Bit von CR0 gelöscht. Allerdings ist die Systemleistung immer noch sehr sehr langsam, genau wie wenn ich den Cache deaktiviere. So scheint es mir, dass das Aktivieren des Cache-Codes nicht funktioniert? Da jedoch das CD-Bit gelöscht wurde, sollte der Aktivierungs-Cache-Code funktioniert haben! Die Frage ist also: Wie lange sollte ich warten, nachdem ich den Cache aktiviert habe, so dass ich die gleiche Leistung habe wie die Performance, bevor ich den Cache deaktiviere?
Übrigens, wenn ich den Enble-Cache-Code ausführe, zeigt die printk-Ausgabe, dass das CD-Bit des CR0 0 ist.
Wenn Sie sich auf einem SMP-System befinden, sollten Sie den Deaktivierungs-Cache-Code für jeden Kern mit smp_call_function()
aufrufen, da es theoretisch möglich ist, dass Ihr Show-Cache-Code auf einem anderen Prozessor läuft. Um diese Funktion zu verwenden, #include <include/linux/smp.h>
.
EDIT: smp_call_function()
ruft den Funktionszeiger auf, der nur auf anderen Kernen gegeben wird, nicht auf dem aktuellen . Stellen Sie sicher, dass Sie die Funktion für alle Kerne ausführen, indem Sie die Funktion selbst im Kern aufrufen, der smp_call_function()
aufruft.
Tags und Links c assembly kernel linux-kernel