OS Awareness
Simics OS awareness è un modulo Simics che comprende le strutture dati e le astrazioni del sistema operativo in esecuzione sul sistema target Simics. Con OS awareness, Simics e il debugger Simics conoscono lo spazio kernel, lo spazio utente, i processi, i thread e i compiti.
Fondamentalmente, OS awareness svolge due compiti: il live tracking degli eventi mentre accadono e l’investigazione dello stato istantaneo del sistema operativo. Il live tracking degli eventi significa che OS awareness rileva quando il sistema operativo esegue un task switch, quando il software esegue una chiamata di sistema, o quando si verificano degli interrupt. Infatti, il modo più comune per rilevare tali eventi è quello di aspettare gli interrupt nel sistema di destinazione – finché non si verificano interrupt, lo stesso software a livello utente è in esecuzione. Quando si verifica un interrupt, il sistema operativo prende il controllo e il processo in esecuzione viene considerato come se fosse stato spento. Quando il sistema operativo ritorna nello spazio utente, si considera che qualche processo sia stato inserito.
Il live tracking determina quando succede qualcosa, ma determinare cosa è successo richiede un’indagine sullo stato istantaneo del sistema operativo. Per esempio, quando scatta un interrupt, quali sono i thread attivi sul processore che ha ricevuto l’interrupt? Per determinarlo, la consapevolezza del sistema operativo ha bisogno di conoscere la struttura delle code dei processi in esecuzione e in attesa, il contenuto delle strutture dei compiti o dei blocchi di controllo dei processi, e altre strutture dati. A condizione che questo sia stato configurato correttamente, OS awareness può quindi attraversare le liste nella memoria di destinazione e determinare il nome del processo attualmente attivo su un particolare processore, tutti i processi esistenti, i moduli software caricati dinamicamente e i loro indirizzi di rilocazione, e qualsiasi altra cosa di interesse.
Perché il contenuto preciso delle task struct e gli offset di particolari campi possono variare tra le build e le versioni del sistema operativo, OS awareness deve essere configurato prima di poter essere utilizzato. Il più delle volte, è possibile determinare i parametri per la consapevolezza del sistema operativo guardando una tabella dei simboli o un file del kernel con informazioni di debug dalla build del sistema operativo. Tuttavia, ci sono sistemi operativi in cui i parametri precisi non possono essere determinati fino al runtime, e in questi casi la configurazione dovrà aspettare fino a quando il sistema di destinazione si sarà avviato. In ogni caso, una volta determinato, l’insieme dei parametri può essere salvato e usato la prossima volta che viene eseguita la stessa configurazione del target.
L’uso di file di parametri rende possibile che le configurazioni di consapevolezza del sistema operativo siano distribuite insieme alle immagini del sistema operativo a cui fanno riferimento. Questo significa che un team di piattaforma può costruire un’immagine OS, configurare la consapevolezza OS per essa, salvare i parametri e fornire ai suoi utenti il sistema operativo e i suoi parametri di consapevolezza OS senza dover fornire file simbolo o informazioni di debug. Il file dei parametri di OS awareness è semplicemente parte dello stack software fornito, ed è attivato negli script di avvio utilizzati per avviare Simics. Gli utenti del sistema non hanno bisogno di sapere come configurare la consapevolezza del sistema operativo – semplicemente lo fanno funzionare non appena avviano le impostazioni del sistema di destinazione fornite. I parametri di OS awareness sono anche salvati all’interno dei file di checkpoint di Simics, in modo che OS awareness continui a funzionare attraverso le operazioni di salvataggio e ripristino dei checkpoint.
OS awareness rende possibile far lavorare le caratteristiche di Simics solo su un particolare sottoinsieme dello stack del software, come avere i breakpoint impostati solo all’interno di un certo processo, o tracciare solo gli accessi alla memoria eseguiti dal kernel e non dai task a livello utente. Un’estensione o uno script Simics scritto dall’utente può ascoltare gli eventi da OS awareness e intraprendere azioni basate su quale software è attualmente in esecuzione nel sistema di destinazione. È possibile chiedere al sistema di consapevolezza OS le notifiche solo per un certo processo, o vedere tutte le azioni per tutti i processi.
Il sistema di consapevolezza OS in Simics opera con il concetto di un albero di nodi. Ogni nodo nell’albero rappresenta un livello di astrazione nel modello di processo del sistema operativo. Tipicamente, il nodo superiore è il sistema operativo stesso, che è poi diviso in compiti di livello kernel e utente. In un sistema operativo come Linux, ogni task di livello utente contiene uno o più thread. Nel kernel, la consapevolezza del sistema operativo normalmente distingue i thread del kernel dal task inattivo, perché questo aiuta a spiegare il tempo di esecuzione del target. La figura 3.3 mostra un esempio di albero dei nodi di un sistema Linux nudo.
Nella CLI e nel debugger GUI di Simics, le query di processo sono usate per trovare i processi di interesse. Queste query possono corrispondere ai nomi dei processi, ai numeri ID dei processi o ad altre proprietà rese disponibili dalla consapevolezza del sistema operativo. Nella maggior parte dei casi, il nome di un processo è sufficiente per identificarlo, ma in sistemi complessi sono necessarie corrispondenze più complesse come “il processo chiamato pippo sulla scheda chiamata bar”. In un sistema di lunga durata in cui un certo programma viene eseguito molte volte, l’ID del processo può essere usato per identificare un particolare inizio di un processo.
Simics OS awareness supporta sistemi operativi annidati per gestire l’OS awareness per sistemi basati su hypervisor. In un sistema con un hypervisor, è necessario tracciare la programmazione dei sistemi operativi guest sui core del processore di destinazione. Una volta che il sistema operativo attivo su un core è stato determinato, è possibile applicare l’OS awareness per quel sistema operativo per determinare il processo o il thread attivo. Un singolo albero è quindi usato per l’intero sistema, con le radici nell’hypervisor.
I dettagli di ciò che OS awareness può tracciare e scoprire sullo stack software di destinazione varia a seconda del sistema operativo ospite e quanto lavoro è stato speso per costruire OS awareness per esso.
Rispetto ai sistemi di OS awareness usati con debugger basati su hardware (JTAG), la capacità di un simulatore di tracciare con precisione i task switch è unica. Tali caratteristiche si sono dimostrate poco pratiche da implementare nei debugger basati sull’hardware, perché incorrerebbero in un overhead significativo e sovrasterebbero la disponibilità dei breakpoint hardware. L’ispezione dello stato istantaneo è essenzialmente lo stesso dell’ispezione di un debugger hardware dello stato del sistema dopo l’arresto del sistema, e infatti lo stesso codice usato per i debugger hardware è stato usato con Simics per determinare fatti come gli indirizzi di rilocazione per i moduli caricati dinamicamente.
Un debugger basato su agenti non ha bisogno della consapevolezza del sistema operativo, perché è in esecuzione all’interno del sistema di destinazione e può usare le API del sistema operativo per chiedere al sistema operativo di destinazione i compiti in esecuzione, i moduli caricati e altre informazioni.