OS Awareness
Simics OS Awareness er et Simics-modul, der forstår datastrukturerne og abstraktionerne i det operativsystem, der kører på Simics-målsystemet. Med OS awareness kender Simics og Simics-debuggeren til kernel space, user space, processer, tråde og opgaver.
Fundamentalt set udfører OS awareness to opgaver: live-sporing af begivenheder, mens de sker, og undersøgelse af den øjeblikkelige tilstand i operativsystemet. Live-sporing af begivenheder betyder, at OS awareness registrerer, når operativsystemet foretager et opgaveskift, når software foretager et systemopkald, eller når der opstår afbrydelser. Den mest almindelige måde at opdage sådanne hændelser på er faktisk at vente på afbrydelser i målsystemet – så længe der ikke sker afbrydelser, kører den samme software på brugerniveau. Når der sker en afbrydelse, tager styresystemet over, og den kørende proces anses for at være blevet skiftet ud. Når operativsystemet vender tilbage til brugerområdet, anses en eller anden proces for at være blevet skiftet ind.
Live tracking bestemmer, hvornår noget sker, men for at bestemme, hvad der er sket, er det nødvendigt at undersøge den øjeblikkelige tilstand i operativsystemet. Når der f.eks. udløses en afbrydelse, hvilke aktive tråde er der så på den processor, der modtog afbrydelsen? For at afgøre dette skal OS awareness kende strukturen af OS-køerne for kørende og ventende processer, indholdet af task structs eller processtyringsblokke og andre datastrukturer. Forudsat at dette er blevet konfigureret korrekt, kan OS awareness derefter gennemgå listerne i målhukommelsen og bestemme navnet på den aktuelt aktive proces på en bestemt processor, alle eksisterende processer, dynamisk indlæste softwaremoduler og deres relokaliseringsadresser og alt andet af interesse.
Da det præcise indhold af task structs og offsets af bestemte felter kan variere mellem forskellige builds og versioner af styresystemet, skal OS awareness konfigureres, før det kan bruges. Oftest er det muligt at bestemme parametrene for OS awareness ved at se på en symboltabel eller en kernefil med debuginformationer fra OS-build’et. Der findes imidlertid operativsystemer, hvor de præcise parametre ikke kan bestemmes før runtime, og i sådanne tilfælde må konfigurationen vente, indtil målsystemet er startet op. Under alle omstændigheder kan sættet af parametre, når det først er fastlagt, gemmes og bruges næste gang den samme målopsætning køres.
Brugen af parameterfiler gør det muligt at få OS awareness-konfigurationer distribueret sammen med de OS-images, som de refererer til. Det betyder, at et platformsteam kan opbygge et OS-image, konfigurere OS awareness for det, gemme parametrene og forsyne sine brugere med OS’et og dets OS awareness-parametre uden at skulle levere symbolfiler eller debug-informationer. OS awareness-parameterfilen er simpelthen en del af den leverede softwarestack, og den aktiveres i de opstartsscripts, der bruges til at starte Simics. Brugerne af systemet behøver ikke at vide, hvordan de skal konfigurere OS awareness – de får det bare til at fungere, så snart de starter de medfølgende målsystemopsætninger. OS awareness-parametre gemmes også inde i Simics checkpoint-filer, så OS awareness fortsætter med at virke på tværs af checkpoint- og gendannelsesoperationer.
OS awareness gør det muligt at få Simics-funktioner til kun at virke på en bestemt delmængde af softwarestakken, f.eks. ved kun at have breakpoints sat inden for en bestemt proces eller ved kun at spore hukommelsestilgange, der udføres af kernen og ikke af opgaver på brugerniveau. En brugerskrevet Simics-udvidelse eller et script kan lytte til begivenhederne fra OS awareness og foretage handlinger baseret på, hvilken software der i øjeblikket kører i målsystemet. Det er muligt at bede OS awareness-systemet om meddelelser kun for en bestemt proces eller at se alle handlinger for alle processer.
OS awareness-systemet i Simics opererer med begrebet et node-træ. Hver knude i træet repræsenterer et abstraktionsniveau i OS-procesmodellen. Typisk er det øverste knudepunkt selve operativsystemet, som derefter opdeles i opgaver på kerne- og brugerniveau. I et styresystem som Linux indeholder hver opgave på brugerniveau en eller flere tråde. I kernen skelner OS awareness normalt mellem kernetråde og den inaktive opgave, fordi det er med til at tage højde for målets udførelsestid. Figur 3.3 viser et eksempel på et node-træ fra et barebones Linux-system.
Figur 3.3. OS awareness tree.
I Simics CLI og debugger GUI bruges procesforespørgsler til at finde processer af interesse. Disse forespørgsler kan matche procesnavne, proces-ID-numre eller andre egenskaber, der stilles til rådighed af OS awareness. I de fleste tilfælde er navnet på en proces tilstrækkeligt til at identificere den, men i komplekse systemer er der behov for mere komplekse matches som f.eks. “processen der hedder foo på boardet der hedder bar”. I et langvarigt system, hvor et bestemt program køres mange gange, kan proces-id’et bruges til at identificere en bestemt start af en proces.
Simics OS awareness understøtter nested operating systems for at håndtere OS awareness for hypervisor-baserede systemer. I et system med en hypervisor er det nødvendigt at spore planlægningen af gæstestyresystemer på målprocessorkernerne. Når det aktive operativsystem på en kerne er blevet bestemt, er det muligt at anvende OS awareness for det pågældende operativsystem for at bestemme den aktive proces eller tråd. Der anvendes således et enkelt træ for hele systemet med rod i hypervisoren.
Detaljerne af, hvad OS awareness kan spore og opdage om målsoftwarestakken, varierer afhængigt af gæstestyresystemet, og hvor meget arbejde der er blevet brugt på at opbygge OS awareness for det.
Sammenlignet med de OS awareness-systemer, der anvendes med hardware-baserede (JTAG) debuggere, er en simulators evne til præcist at spore task switches enestående. Sådanne funktioner har vist sig at være upraktisk at implementere i hardware-baserede debuggere, fordi de ville medføre et betydeligt overhead og overvælde tilgængeligheden af hardware breakpoints. Inspektionen af den øjeblikkelige tilstand er i det væsentlige den samme som en hardwaredebuggers inspektion af systemtilstanden efter at have stoppet systemet, og faktisk er den samme kode, som bruges til hardwaredebuggere, blevet brugt med Simics til at bestemme fakta som relokeringsadresser for dynamisk indlæste moduler.
En agentbaseret debugger har ikke brug for kendskab til styresystemet, fordi den kører inde i målsystemet og kan bruge styresystemets API’er til at spørge målstyresystemet om kørende opgaver, indlæste moduler og andre oplysninger.