OS Awareness
Simics OS Awareness ist ein Simics-Modul, das die Datenstrukturen und Abstraktionen des Betriebssystems versteht, das auf dem Simics-Zielsystem läuft. Mit OS-Awareness wissen Simics und der Simics-Debugger über Kernel-Space, User-Space, Prozesse, Threads und Tasks Bescheid.
Fundamental führt OS-Awareness zwei Aufgaben aus: die Live-Verfolgung von Ereignissen, während sie passieren, und die Untersuchung des momentanen Zustands des Betriebssystems. Die Live-Verfolgung von Ereignissen bedeutet, dass OS Awareness erkennt, wenn das Betriebssystem einen Taskwechsel durchführt, wenn Software einen Systemaufruf tätigt oder wenn Unterbrechungen auftreten. Die gängigste Methode, solche Ereignisse zu erkennen, besteht darin, auf Unterbrechungen im Zielsystem zu warten – solange keine Unterbrechungen auftreten, läuft die gleiche Software auf Benutzerebene. Wenn eine Unterbrechung eintritt, übernimmt das Betriebssystem und der laufende Prozess wird als ausgeschaltet betrachtet. Wenn das Betriebssystem in den Benutzerbereich zurückkehrt, gilt ein anderer Prozess als eingeschaltet.
Das Live-Tracking bestimmt, wann etwas passiert, aber um festzustellen, was passiert ist, muss der momentane Zustand des Betriebssystems untersucht werden. Wenn zum Beispiel ein Interrupt ausgelöst wird, was sind die aktiven Threads auf dem Prozessor, der den Interrupt erhalten hat? Um dies festzustellen, muss das Betriebssystem die Struktur der OS-Warteschlangen laufender und wartender Prozesse, den Inhalt der Task-Strukturen oder Prozesssteuerungsblöcke und andere Datenstrukturen kennen. Wenn dies korrekt konfiguriert ist, kann OS Awareness dann die Listen im Zielspeicher durchlaufen und den Namen des gerade aktiven Prozesses auf einem bestimmten Prozessor, alle existierenden Prozesse, dynamisch geladene Softwaremodule und ihre Verschiebungsadressen sowie alles andere Interessante ermitteln.
Da die genauen Inhalte der Task-Strukturen und die Offsets bestimmter Felder zwischen den verschiedenen Betriebssystemen und Versionen variieren können, muss OS Awareness konfiguriert werden, bevor es verwendet werden kann. In den meisten Fällen ist es möglich, die Parameter für OS-Awareness zu bestimmen, indem man sich eine Symboltabelle oder eine Kernel-Datei mit Debug-Informationen aus dem Betriebssystem-Build ansieht. Es gibt jedoch Betriebssysteme, bei denen die genauen Parameter erst zur Laufzeit bestimmt werden können, und in solchen Fällen muss mit der Konfiguration gewartet werden, bis das Zielsystem gebootet hat. In jedem Fall kann der einmal ermittelte Parametersatz gespeichert und bei der nächsten Ausführung desselben Zielsystems verwendet werden.
Die Verwendung von Parameterdateien ermöglicht es, Konfigurationen für das Betriebssystembewusstsein zusammen mit den Betriebssystem-Images, auf die sie sich beziehen, zu verteilen. Das bedeutet, dass ein Plattformteam ein Betriebssystem-Image erstellen, OS-Awareness dafür konfigurieren, die Parameter speichern und seine Benutzer mit dem Betriebssystem und seinen OS-Awareness-Parametern versorgen kann, ohne Symboldateien oder Debug-Informationen bereitstellen zu müssen. Die Datei mit den OS-Awareness-Parametern ist einfach Teil des mitgelieferten Software-Stacks und wird in den Startskripten aktiviert, die zum Starten von Simics verwendet werden. Die Benutzer des Systems müssen nicht wissen, wie OS-Awareness zu konfigurieren ist – sie können es einfach in Betrieb nehmen, sobald sie die mitgelieferten Zielsystem-Setups starten. OS-Awareness-Parameter werden auch in Simics-Checkpoint-Dateien gespeichert, so dass OS-Awareness über Checkpoint-Sicherungs- und -Wiederherstellungsoperationen hinweg funktioniert.
OS-Awareness macht es möglich, Simics-Funktionen nur auf einer bestimmten Teilmenge des Software-Stacks arbeiten zu lassen, z.B. Breakpoints nur innerhalb eines bestimmten Prozesses zu setzen oder nur Speicherzugriffe zu verfolgen, die vom Kernel und nicht von Tasks auf Benutzerebene ausgeführt werden. Eine vom Benutzer geschriebene Simics-Erweiterung oder ein Skript kann auf die Ereignisse der OS-Awareness hören und Maßnahmen ergreifen, die darauf basieren, welche Software gerade auf dem Zielsystem läuft. Es ist möglich, das OS-Awareness-System um Benachrichtigungen nur für einen bestimmten Prozess zu bitten, oder alle Aktionen für alle Prozesse zu sehen.
Das OS-Awareness-System in Simics arbeitet mit dem Konzept eines Knotenbaums. Jeder Knoten im Baum repräsentiert eine Abstraktionsebene im OS-Prozessmodell. Typischerweise ist der oberste Knoten das Betriebssystem selbst, das dann in Tasks auf Kernel- und Benutzerebene aufgeteilt wird. In einem Betriebssystem wie Linux enthält jeder Task der Benutzerebene einen oder mehrere Threads. Im Kernel unterscheidet das Betriebssystem normalerweise zwischen Kernel-Threads und dem Idle-Task, da dies zur Berücksichtigung der Zielausführungszeit beiträgt. Abbildung 3.3 zeigt ein Beispiel für einen Knotenbaum eines Barebones-Linux-Systems.
In der Simics CLI und der Debugger-GUI werden Prozessabfragen verwendet, um Prozesse von Interesse zu finden. Diese Abfragen können mit Prozessnamen, Prozess-ID-Nummern oder anderen von der OS-Awareness zur Verfügung gestellten Eigenschaften übereinstimmen. In den meisten Fällen reicht der Name eines Prozesses aus, um ihn zu identifizieren, aber in komplexen Systemen sind komplexere Übereinstimmungen erforderlich, wie z. B. „der Prozess namens foo auf dem Board namens bar“. In einem langlaufenden System, in dem ein bestimmtes Programm viele Male ausgeführt wird, kann die Prozess-ID verwendet werden, um einen bestimmten Start eines Prozesses zu identifizieren.
Simics OS Awareness unterstützt verschachtelte Betriebssysteme, um OS Awareness für Hypervisor-basierte Systeme zu handhaben. In einem System mit einem Hypervisor ist es notwendig, das Scheduling von Gastbetriebssystemen auf den Zielprozessorkernen zu verfolgen. Sobald das aktive Betriebssystem auf einem Kern ermittelt wurde, ist es möglich, OS Awareness für dieses Betriebssystem anzuwenden, um den aktiven Prozess oder Thread zu bestimmen.
Die Einzelheiten dessen, was OS Awareness über den Zielsoftwarestack verfolgen und herausfinden kann, hängen vom Gastbetriebssystem ab und davon, wie viel Arbeit in die Entwicklung von OS Awareness für dieses System investiert wurde.
Im Vergleich zu den OS Awareness-Systemen, die mit hardwarebasierten (JTAG-)Debuggern verwendet werden, ist die Fähigkeit eines Simulators, Taskwechsel genau zu verfolgen, einzigartig. Es hat sich als unpraktisch erwiesen, solche Funktionen in hardwarebasierten Debuggern zu implementieren, da sie einen erheblichen Overhead verursachen und die Verfügbarkeit von Hardware-Breakpoints überfordern würden. Die Untersuchung des momentanen Zustands ist im Wesentlichen die gleiche wie die Untersuchung des Systemzustands nach dem Anhalten des Systems durch einen Hardware-Debugger, und in der Tat wurde derselbe Code wie bei Hardware-Debuggern mit Simics verwendet, um Fakten wie Verschiebungsadressen für dynamisch geladene Module zu ermitteln.
Ein agentenbasierter Debugger benötigt keine Kenntnis des Betriebssystems, da er innerhalb des Zielsystems läuft und Betriebssystem-APIs verwenden kann, um das Zielbetriebssystem über laufende Aufgaben, geladene Module und andere Informationen zu befragen.