Jo, womit soll es weitergehen? Also gestern haben wir geguckt. Das war die letzte Folie.
Hatten uns überlegt, wie schaut das mit den Segmenten aus. Wir haben gesagt, er holt die
Instruktion von der Adresse, die sich bildet, aus der Basisadresse vom Kurzsegment plus dem
Instruction Pointer. Dann hat er die Instruktion, ein paar Zugriffe. Dann muss er den Operanten
holen. Das soll heißen, er soll aufs Datensegment zugreifen, weil das ist BX und nicht BP.
Datensegment zugreifen heißt, Basisadresse vom Datensegment nehmen, EBX draufhalten,
aufwadieren und das als Adresse verwenden zum Laden. Dann die Addition durchführen
und dann das Speichern ins Datensegment. Also den ganzen Kram noch einmal. Habe ich gestern
gesagt, schon aus Performancegründen macht man es natürlich nicht jedes Mal, dass man
die Basisadresse vom Datensegment, vom Kurzsegment aus der Deskripto-Tabelle holt. Das wäre
halt in diesem Fall noch einmal drei Speicherzugriffe zusätzlich. Sondern die Dinger werden einmal
geladen in dem Moment, wo ich in mein Datensegment was reinschreibe. Also wenn wir haben, unsere
DIN, hier gibt es einen Eintrag mit der Adresse 8. Da steht drin, die haben wir gestern als
Beispiel, die 2000 als Basis und die 1000 als Limit. Und ich kopiere eine Move-Konstante
8 nach Datensegment, dann kopiert er einmal die 8 sozusagen nach DS und er kopiert die
2000 nach, ja, eben jemand hat gestern gefragt, wie heißen die Dinger denn jetzt eigentlich?
Die haben keinen Namen, die registren. Das ist jetzt irgendwie so DS-Basis und 1000 nach
DS-Limit. Und was passiert noch?
Nein, aber es wird in der Tabelle was markiert, nämlich es wird hier noch, also das sind ein,
zwei Werte. Ja, und es gibt noch hier, es wird noch eine 1 gesetzt für das Excessed
Bit. Also das Segment wurde auch wirklich gebraucht. Ihr kennt es wahrscheinlich vielleicht
schon aus den Page-Tabellen, da gibt es dann Excessed Bit und ein Dirty Bit, wenn man mal
die Page benutzt hat, kann das Betriebssystem dann nutzen, so für irgendwie Swapping, nach
dem Motto, die Page wurde nie gebraucht, also kann man sie mal rauslagern, so ähnlich hier,
wenn das Segment nie gebraucht wurde, dann kann man das Segment eventuell als Ganzes
mal rauskopieren auf Platte. Es stehen hier noch ein paar andere Werte und das sind die,
wie heißen denn eigentlich die Attribute, also die gehen sozusagen nach DS-Attributeil.
Da steht zum Beispiel drin, ob man lesen darf, ob man schreiben darf, ob man das Segment ausführen
darf. Jo, also, das schreibe ich hin, unter der Haube passiert hier viel mehr. Hatte damals
einfach den Vorteil, naja, das war jeder Programmierer schon gewohnt, dass es solche Segmente gibt
und wie man sie benutzt und naja, den Unterschied, jetzt, früher war halt die 8 sozusagen gleichzeitig
die Basisadresse, jetzt ist die 8 irgendwie nur noch so eine Nummer und die Basisadresse,
die ist jetzt vom Betriebssystem dann eben variabel einstellbar. Zum Beispiel kann man
dann eben so eine Art Swapping machen, also 80286 konnte man Segmente rausschmeißen
vom Betriebssystem und andere wieder nachladen, also so eine Art Overlay-Technik oder sowas
in der Art. Jo, wie macht man denn damit einen Kontextwechsel?
Na ja, wenn jetzt ein Prozess läuft und es kommt der nächste dran, der soll ja doch andere
Segmente kriegen. Okay, die ignoriere ich hier völlig, die brauchen wir nicht, die sind
einfach noch viel grausam. Das will ich euch mal nicht zumuten. Ja, mit dem, was wir bisher
missen. Also von der Idee her, nochmal genauer gleich darüber nachdenken, also von der Idee
her ist ein Switch irgendwie ein Push-DS, Push-ES und da hernach, dann ein Move, neue
GDT, Quatsch, nicht Move, sondern LGDT, neue GDT laden, ja so. Und dann kommt es wieder
umgekehrt ein Pop und irgendwann ein Ratan. Also so von der Idee her geht es. Gut, was
ist die Sicherheit dabei? Also hier schreibe ich, was weiß ich, die vorher geladene 8 einfach
auf den Stack. Steht halt eine 8 auf dem Stack, nur die 8, es steht nicht die 2000, nicht
die 1000, der ganze andere Kram, der steht nicht auf dem Stack, nur die 8 und dann halt
noch ein paar andere Zahlen gespeichert. Dann hole ich mir die neue GDT, dann habe ich eine
neue Tabelle für den neuen Prozess und wenn ich jetzt ein Pop, sag mal Pop 8 aufrufe,
dann schreibe ich die 8 wieder in ein Segmentregister und beim Pop holt er sich halt aus der Tabelle
wieder die ganzen Werte, die da drin stehen und schreibt die ganzen Schattentabellen.
Presenters
Zugänglich über
Offener Zugang
Dauer
01:26:17 Min
Aufnahmedatum
2013-01-11
Hochgeladen am
2019-05-06 12:49:02
Sprache
de-DE
Vorgestellt werden verschiedene Virtualisierungs-Ansätze:
-
Emulation
-
Just-In-Time-Compiler
-
Para-Virtualisierung
-
Bibliotheks-basierte Virtualisierung
-
OS-Virtualisierung
Lernziele und Kompetenzen:
Studierende, die das Modul erfolgreich abgeschlossen haben:
-
erläutern verschiedene Motivationen für den Einsatz von VMs
-
unterscheiden verschiedene VMs
-
klassifizieren verschiedene Ziele unterschiedlicher VMs (z.B. Performance, Konfigurierbarkeit, Genauigkeit, ...)
-
hinterfragen verschiedene Simulationansätze für MMUs
-
erstellen virtuelle Komponenten und Busse
-
strukturieren Callbacks und entsprechendes Forwarding und Caching
-
unterscheiden zwischen Architektur, Chip und Komponente
-
klassifizieren unterschiedliche Just-In-Time-Compiler-Ansätze
-
erzeugen JIT Code aus vorgefertigten Code-Teilen
-
bewerten unterschiedliche JIT-Code-Optimierungen
-
erläutern Probleme bei der JIT-Code-Invalidierung
-
nennen JIT Probleme mit Exceptions/Interrupts sowie berechnete Sprüngen und Return-Instruktionen
-
unterscheiden verschiedene JIT Cache-Verwaltungen
-
beschreiben Möglichkeiten der Fehlerinjektion durch VMs
-
entwickeln ein an JIT angepasstes virtuelles "Hardware"-Design
-
erläutern die Java-VM Instruktionssatz-Architektur
-
nutzen Hardware-basierte Virtualisierung
-
entwickeln Verfahren zum Ausfiltern bestimmter Befehle
-
erläutern Probleme der Speicherverwaltung bei HW-basierter Virtualisierung
-
nutzen User-Mode-Emulation zur Paravirtualisierung
-
diskutieren Möglichkeiten von Debuggern für die Umleitung von System-Calls und die Ausfilterung von Befehlen
-
nutzen einen Hypervisor zur Paravirtualisierung
-
unterscheiden verschiedene Ansätze zur Geräteverwaltung in paravirtualisierten Systemen
-
erläutern Betriebssystem-basierte Virtualisierung
-
entwickeln unterschiedliche Bibliotheks-basierte Virtualisierungen
-
erläutern Probleme beim Speicher-Layout bei Bibliotheks-basierte Virtualisierung
-
konzipieren Personalities für Bibliotheks-basierte Virtualisierungen
-
beurteilen Probleme bei der korrekten Zeit-Simulation
-
nennen Ideen für die dynamische Anpassung der Zeit-Simulation
-
klassifizieren bekannte VMs (z.B. VICE, FAUmachine, QEMU, Bochs, JVM, KVM, User-Mode-Linux, Xen, VServer, Wine)
-
diskutieren in der Gruppe Vor- und Nachteile von bestimmten VM-Ansätzen
-
untersuchen CPU-Emulationen
-
untersuchen Geräte-Emulationen