?
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.