Sie befinden sich hier: Termine » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 4 » VM Pruefung von 24.02.2016   (Übersicht)

VM Pruefung von 24.02.2016

Daten

Pruefer: Volkmar Sieh Beisitzer: Rainer Mueller Datum: 24.02.2016 Ergebnis: Sehr gut

Stimmung, Vorbereitung

Hab mich vorbereitet, indem ich alle Vorlesungen nochmal angeguckt habe, dabei eine Zusammenfassung und Annotation der Folien geschrieben habe. Anschliessend mit einem Kommilitonen Themen besprochen und Einzelheiten zum Verstaendnis nochmal nachgefragt.

Generell war die Pruefung schwer zu protokollieren, weil es weniger eine Frage-Antwort-Pruefung war. Vielmehr hat der Pruefer kurz einen Sachverhalt angerissen und dann sollte man dazu erzaehlen. Wenn ich nicht draufgekommen bin, hat er allerdings schon Stichworte gegeben, an denen ich mich entlang hangeln konnte. Die Atmosphaere war sehr entspannt. Der Beisitzer hat immer wohlwollend genickt, wenn ich was richtiges gesagt hab, das hat die Anspannung sehr reduziert.

Fragen

P: Ihr habt da ja so eine VM gebaut. Was war das schwierigste?

(Hat mich kalt erwischt, die Frage, obwohl sie wohl zum Einstieg gedacht war) S: Aeh… die Instruktionen nachbauen hat viel Zeit gekostet… Debuggen…

P: Was ist mit Flags und wie kann man sie optimieren? S: Flags werden fuer Spruenge und bestimmte Operationen (Add with carry) benoetigt. Wenn man JIT macht, kann man…

P: Ignorieren wir JIT erstmal. Bleib beim Emulieren.

S: Beim Emulieren kann man auch nur dann berechnen, wenn man sie wirklich braucht. Dazu hebt man sich die Operation und einen Operanden und ein Ergebnis oder zwei Operanden auf.

(Hier hat er mehrfach nachgehakt, wollte wissen, wie man das dann bei SUB mit anschliessendem JEQ und ADD mit anschliessend benoetigtem Carry-Flag macht. Hier hat er wohl Verstaendnis geprueft, nehme ich an.)

P: Du hast ja schon JIT erwaehnt. Wie macht man die Flag-Berechnung da?

S: Prinzipiell genauso, man kompiliert halt die Berechnung mit rein, wenn sie benoetigt wird.

P: Ja, wann braucht man sie noch?

S: Bei Exceptions muss man sie auch berechnen.

P: Warum, wofuer braucht man sie?

S: Naja, man muss sie auf den Stack pushen… Bei der Div/0 braucht man sie vielleicht… Koennte man sie beim Page fault irgendwie brauchen?… Mhm.. Keine Ahnung, mir faellt jetzt nicht ein, wofuer man sie braeuchte.

P: Da hab ich dich jetzt vielleicht in die Irre gefuehrt. Der Debugger will die naemlich wissen. Was sind denn die Unterschiede bei der RISC-Architektur? Wie viel schneller kann man das dann emulieren?

S: Da hat man einen speziellen Befehl, der das berechnet. Dadurch kann man sich es sparen, die Flags jedes mal zu berechnen, sondern macht das ondemand.

(P: Ein bit, das gesetzt ist, fordert Flag-Berechnung an).

S: Ansonsten hat man nur load/store, also kann ein andere Befehl nur auf Registern arbeiten und daher koennen keine Page-Faults dabei auftreten. Befehle holen muss man natuerlich trotzdem, kompilieren, kompilat laden… also so viel schneller kanns nicht sein, weil man die Exception-Pruefung ja trotzdem braucht, weil eine Division durch Null auftreten kann.

P: Ja, aber es gibt keine Divisionen (Ich denke ich hab hier nicht genau verstanden, was er meinte… ich habs mal nachgesehen ARM kennt Division aber berechnet dabei keine Flags, wahrscheinlich meinte er das).

S: Ja, ok dann wirds natuerlich schon schneller, weil man sich das if(exception) goto Fehlerbehandlung; sparen kann.

P: Wie baut man denn die MMU im Emulator?

S: Speicher allokieren, der ist dann der virtuelle Speicher, CPU fordert virtuelle Adresse an. Zuerst haben wir dann eine physikalische zurueckgeliefert, spaeter direkt einen Pointer in den allokierten Host-Speicher.

P: Das nennt man dann ja TLB, obwohls eigentlich keiner ist. Da kann dann noch zusaetzliche bits eintragen. Wozu?

S: Um Seiten schreibzuschuetzen. Man kann aber auch stattdessen in der virtuellen Adresse eins der bits 3-11 setzen, dann trifft man nie die Adresse und kann zusaetzliche checks machen.

P: Was macht man, wenn man eine Adresse hat, die in den ROM geht?

S: Naja, man muss im Prinzip auch diese Bits setzen, denn Pointer auf Speicher darf man ja nicht returnen… in den checks muss man dann entweder irgendwie ne Ausnahme anzeigen oder auf callbacks zurueckfallen.

P: Wenn das OS jetzt eine Seite eintraegt, die nicht schreibbar sein soll, wie macht man das dann?

S: (Hab das ziemlich grob erklaert, er wollte darauf hinaus, dass man das nicht in die „schreibbaren“ TLBs eintraegt, nur in den, in dem implizit nur schreibbare Seiten gecacht werden)

P: Gut. Stichwort XEN, Paravirtualisierung. (Kurze Einfuehrung …) Wie muss man da jetzt den Gast-Kern anpassen.

S: Treiber umbauen, sodass sie auf Syscalls des Hosts zurueckgreifen…

P: (Stubst mich in die richtige Richtung) Wie macht man das mit der MMU?

S: Da der Gast weiss, dass er virtualisier wird, gibts drei Moeglichkeiten: Hypervisorcalls, aber die sind bei Kontextwechseln teuer. Oder Schattentabellen, in die der Gast eintraegt und der Hypvervisor bei einem Page-fault nutzt um ondemand Seiten zu laden. Oder wie bei der Hardwarevirtualisierung, dass der Gast in die Pagetabellen eintraegt, die read-only sind und dadurch einen Pagefault ausloest. Der Hypervisor schreibt dann die Gast-Sicht in die Tabelle, traegt sie aus der uebergeordneten Tabelle aus und laest den Gast machen. Zugriff loest wieder einen Page-Fault aus, dann Ueberpruefung durch den Hypervisor, ummappen und wieder eintragen.

P: Was kann man da jetzt noch optimieren?

S: Oehm… Der Hypervisor wird halt schoen klein, weil da keine Dateisystemtreiber und so reinmuessen…

P: Ja, ich meinte bei der MMU gegenueber der Hardwarevirtualisierung?

S: Domaenen wissen, dass sie virtualisiert sind ⇒ Man muss die Pages nicht vor ihnen schuetzen, sodass sie auch die Sicht des Hosts in den Pages sehen duerfen, nachdem der sie umgeaendert hat.

P: Kann man Geraete nicht auch direkt dem Gast geben?

S: Ja, Intel unterstuetzt das zB, dass man Gerate am Bus abschaltet beim VM-Wechsel. Aber dann muss man alle Geraete duplizieren, da kann man sich die VM auch sparen.

P: Gibts noch eine dritte Moeglichkeit?

S: Man kann auch nutzen, dass Domaene 0 eh schon alle Treiber an Bord hat, dann leitet der Hypervisor calls dorthin um. Um das ganze zu optimieren kann man grosse Datenmengen seitenweise uebertragen und im Zweifel on-demand befuellen.

P: Zum Schluss noch: wie laeufts mit Netzwerk?

S: Die meisten Netzwerkkarten koennen kein loopback ⇒ Sie wuerden Pakete, die an andere Domaenen gehen einfach ins Netz stecken, wo sie verloren gingen. Daher virtuelle Netzwerkkarte, dorthin internen Traffic routen, direkt wieder in die Dom0 rein und von dort ans Ziel.