Speicherverwaltung - Betriebsysteme
-
Hallo,
muss im Rahmen einer Hausarbeit mich mit 'virtuellen Speicher' befassen.
Gegenstand dieser Hausarbeit ist ein Interpreter für eine fiktive Sprache, der nun erweitern soll um 2 MMU's, (Speicherverwaltung)
Folgende Eckdaten sind mitgegeben:
Die zwei MMU's besitzen über eine Seitengröße von 1024.
Ein Register(=Datenspeicher) und eine Instruktion sind mit jeweils 16 bit kodiert. Der Programmspeicher von diesem System ist leider nur 2k groß. Die Anzahl der Register sind auf 4k begrenzt.
Meine Frage, kann das mir jemand mal mit seinen eigenes Worten beschreiben? Mit dieser Aufgabenstellung komme ich nicht klar.
-
Naja, was ist dir denn unklar?
Du hast eine Maschine mit getrenntem Programm- und Datenspeicher. Dein Datenspeicher hat eine Kapazität von 4k 16-Bit-Worten. Dein Programmspeicher kann 2k 16-Bit-Befehle aufnehmen.
Du sollst nun jeweils eine MMU (für Daten- und Befehlsspeicher) implementieren und dabei eine Seitengröße von 1024 Worten benutzen.
-
HAL1961!!! wow, die Welt ist klein!
Also kann ich nun expliziter fragen, also sagen wir, habe folgende Codestückel, was ich in mein HAL-Interpreter reinlesen:
START
IN 1
LOAD 18
STORE 10
..
..
..Jetzt werden all diese Befehle eingelesen, wenn die Befehle und Register 2K überschreiten, kommt jetzt das Paging ins Spiel, stimmt das soweit?
Wenn ja, wie mache ich das?
super vielen Dank schonmal im Voraus, hänge seit mehr als 2 Tagen an dieser, vermutlich einfachen Aufgabe, aber es hat noch nicht KLICK gemacht
..
-
genau diese Aussage:
Du sollst nun jeweils eine MMU (für Daten- und Befehlsspeicher) implementieren und dabei eine Seitengröße von 1024 Worten benutzen.
heißt dass, dass dort 1024 Worte jeweils rein passen, 1024 Instruktionen oder 1024 Register, oder gemischt eben.
-
seriouz schrieb:
HAL1961!!! wow, die Welt ist klein!
Ja, ist bei mir allerdings schon eine Weile her.
seriouz schrieb:
genau diese Aussage:
Du sollst nun jeweils eine MMU (für Daten- und Befehlsspeicher) implementieren und dabei eine Seitengröße von 1024 Worten benutzen.
heißt dass, dass dort 1024 Worte jeweils rein passen, 1024 Instruktionen oder 1024 Register, oder gemischt eben.
Du hast ja zwei komplett unabhängige MMUs. Daten und Befehle liegen in unterschiedlichen Adressräumen. Das Prinzip ist aber beides Mal das gleiche.
Du hast einen Adressraum der Größe 2^16 Worte. Es können also virtuelle Adressen von 0 bis 65.535 existieren. Bei einer Seitengröße von 1024 macht das 64 Seiten. Davon können aber immer nur 2 (bei der MMU für den Befehlsspeicher) bzw. 4 (bei der "Daten-MMU") gleichzeitig im Speicher vorhanden sein. Wird auf eine Adresse zugegriffen, deren Inhalt sich nicht im Speicher befindet, muss das zum Auslösen eines Pagefaults/Seitenfehlers führen, woraufhin die entsprechende Seite von der "Platte" nachgeladen wird.
Dabei musst du dir natürlich immer merken (mit einem Present-Bit in der Seitentabelle z.B.), welche Seiten sich gerade im Speicher befinden. Außerdem musst du entscheiden, welche Seite rausgeworfen wird, falls der Speicher voll ist, siehe Seitenersetzungsverfahren.
Je nachdem wie du das ganze implementierst, reicht es sicherlich, das Nachladen von der Platte durch Nachladen aus einem anderen Array entsprechender Größe zu simulieren, geht ja nur ums Prinzip.
Mal ein Beispiel für den Datenspeicher. Du hast folgende Instruktionen direkt am Anfang eines HAL-Programms:
IN 1 STORE 0 // Pagefault: Seite 0 wird aus Hintergrundspeicher geladen STORE 1024 // Pagefault: Seite 1 wird geladen STORE 2048 // Pagefault: Seite 2 laden STORE 3072 // PF: Seite 3
Jetzt ist dein Speicher voll und deine Seitentabelle muss für die Seiten 0-3 irgendwie festhalten, dass sie im Speicher liegen.
LOAD 4 // kein Pagefault: Seite 0 befindet sich schon im Speicher LOAD 8500 / Pagefault
Jetzt musst du Seite 8 laden und, je nach gewählter Ersetzungsstrategie, eine andere Seite ersetzen. Diese kannst du aber, sofern sie verändert wurde (am ebenfalls von dir zu pflegendem Dirty-Bit erkennbar), nicht einfach wegwerfen, sondern musst sie in den Hintergrundspeicher zurückschreiben. Anschließend Seite 5 laden und in der Seitentabelle als vorhanden markieren und die, die du rausgeworfen hast, als nicht vorhanden.
Mach das am besten einfach erstmal nur für den Datenspeicher. Wie gesagt, für den Programmspeicher ist es im Prinzip das gleiche. Wenn du da ein JUMP 1500 machst, und nur die Befehle von Adresse 0 bis 1023 und von 2048 bis 3071 im Speicher liegen, gibt es genauso einen Seitenfehler und die entsprechende Speicherseite muss nachgeladen werden.