Tracing tråden afbryder systemkaldet via ptrace Systemkaldet til værten ændres til getpid Processens stak manipuleres til at kalde kernen Kernen returnerer til processen Design Systemkald
Design Startup/shutdown Startup Processen initialiseres for at kunne ligne en rigtig maskine Analogt til boot loader funktionaliteten Fysisk hukommelsesområde sættes op Task structure, stack og idle proces initialiseres Idle processen kalder start_kernel og den virtuelle maskine booter Init processen starter op og fungerer som tracing tråd Shutdown Nedlukning håndteres af arkitekturspecifikke rutiner I UML-porten foregår det således: Alle levende processer dræbes (inklusive helper threads) Tracing tråden afslutter nedlukningen Ved halt vil tracing tråden blot afslutte Ved reboot loopes tilbage til initialiseringskoden
Generisk kerne Task structure oprettes Arch laget sørger for den maskinafhængige del Design Oprettelse/nedlæggelse af processer UML-Port Ny proces oprettes på værten for hver ny VM proces Processer på værten oprettes af tracing tråden Tracing tråden har brug for at ptrace alle nye processer Ptrace er simplere, hvis tracing tråden er forælder Proces initialisering Signal handlers sættes op (SIGSEGV, SIGIO, SIGVTALRM) Processen sætter sig selv til at blive ptraced af forælder Ved endt initialisering sender processen SIGSTOP til sig selv Tracing tråden ser dette og sætter systemkalds returværdien til 0 Ligeledes sættes returværdien for forking processen til pid for den nye proces
Design Oprettelse/nedlæggelse af processer (fortsat) Skedulering Den nye proces signaleres, og handleren kalder schedule_tail Processen sender et SIGSTOP til sig selv Tracing tråden kopierer registrene fra forking processen til den nye proces Proces nedlæggelse Kmalloced buffere i processens thread structure frigives Processen på værten dræbes
Design Context switching Hver proces har sin egen tråd på værten Ved frivilligt context switch kaldes schedule som sender besked til tracing tråden Sider kan blive paged ud mens en proces sover Sider som bliver paged ud mens en proces sover bliver gemt i en cirkulær buffer
Design Traphåndtering og hukommelsesfejl Traphåndtering UML implementerer traps ved signaler Clock interrupts ved SIGALRM og SIGVTALRM I/O device interrupts ved SIGIO Memory faults ved SIGSEGV Traphandlers kører i kernetilstand Traphandlers kører på proces kerne stakken med system kalds tracing slået fra Hukommelsesfejl (Memory faults) Linux implementerer demand loading af proces kode og data Når en ikke-eksisterende side (page) tilgås, trappes en hukommelsesfejl Seg. fault handleren bestemmer om fejlen opstod i user-mode eller kernel-mode I user-mode: Hvis siden burde eksistere gøres den tilgængelig (Page fault mechanism) Ellers sendes SIGSEGV til den forespørgende processen I kernel-mode: Hvis siden burde eksistere gøres den tilgængelig Ellers panikker kernen
Design Låsning og IRQ håndtering Låsning Interrupt blokering Interrupts er signaler Interrupts blokeres vha. sigprocmask SMP låsning Instruktionerne til SMP låsning er ikke priviligerede i i386 arkitekturen UML nedarver SMP låsning direkte fra i386 porten Semaforer Semafor primitiverne er ikke priviligerede i i386 UML nedarver semafor primitiverne fra i386 porten IRQ håndtering UML IRQ systemet svarer næsten til i386 porten Signal handleren bestemmer, hvilken IRQ signalet repræsenterer Derpå kaldes do_irq og interrupten håndteres som i alle andre ports
Udvidelser COW block driver Hvad er COW? COW er Copy On Write layering En privat skrivbar fil (COW laget) suplerer en delt read-only fil (backing filen) Dette giver et billede af et sammenhængende read/write block device. Flere VM'er kan dele et enkelt filsystem Der skriver kun til COW laget Der læses enten fra COW laget eller fra backing filen COW filstruktur COW fil header: Magic number Versionsnummer Sti til backing filen Seneste modifikationstid og filstørrelse for backing filen Sector størrelse Bitmap der angiver, hvilke blokke der er blevet ændret => hukommelsen COW filen er "sparse" og kun modificerede blokke er allokeret på disken Læsning og skrivning foregår til samme position i både COW og backing fil
Udvidelser COW block driver (fortsat) Fordele COW mindsker forbrug af diskplads ved flere VM'er COW forbedre ydeevnen (Caching) Nemt at lave en ny COW fil og dermed starte fra scratch COW filen kan flettes ind i backing filen med uml_moo
Udvidelser hostfs Hvad er hostfs? Virtuelt UML filsystem Giver adgang til værtens filsystem Værtens kataloger kan mountes direkte med mount via hostfs Design Hostfs er implementeret som en user-space og en kernel-space del Kernel-space delen: Implementerer VFS interfacet VFS funktioner implementeres som kald til user-space delen User-space delen: Udfører kaldene som libc kald på værten Fordele Eksterne resourcer kan tilgås som filer Som eksempel vil en database kunne tilgås som filsystem under UML Ulemper Hostfs kan ikke begrænses til bestemte kataloger Mulighed for DOS angreb på værtens diskplads
Anvendelse Udvikling/kerne debugging Oprindelige mål med UML porten Giver mulighed for kerneudvikling uden separat testmaskine Giver mulighed for at anvende gdb og andre udviklingsværktøjer med Linux kernen Gdb og UML gdb kan ikke umiddelbart bruges sammen med UML Derfor startes gdb af tracing tråden under systemkalds tracing Tracing tråden fanger ptrace og andre systemkald fra gdb og eksekverer disse Disse systemkald annulleres og returværdien skrives tilbage til gdb
Anvendelse Virtuelt netværk Mulighed for at sende til værten og ud på de netvæk som værten er tilsluttet Mulighed for at sende til andre UML på samme vært En tråd på værten som agerer switch for det virtuelle netværk Brug ved f.eks.: Undervisning i netværk Test af netvært programmer Prototype af netvært struktur Test af clustering
Fremtidigt arbejde Fremtiden for UML Beskytte kernehukommelsen mod brugerprogrammer Mulighed for "rigtige" drivere Værts operativ systems ports SMP support UML som et normal brugerprograms bibliotek