|
|
| (55 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
| Zeile 4: |
Zeile 4: |
| | == MMU - Memory Management Unit == | | == MMU - Memory Management Unit == |
| | | | |
| − | Eine MMU verwaltet den Verfügbaren Arbeitsspeicher eines Computer System. Im Falle einer 8 Bit CPU, die einen sehr eingeschränkten Adressraum hat, wird durch den Einsatz einer MMU der Adressraum stark erweitert. Der Adressraum einer Motorola 6809 CPU ist auf 64K beschränkt, man spricht vom '''logischen Adressraum'''. Die MMU hingegen hat einen viel größeren Adressraum von mehreren MB, das bezeichnet man als '''physischen Adressraum'''. | + | Eine MMU verwaltet den Verfügbaren Arbeitsspeicher eines Computer System. Im Falle einer 8 Bit CPU, die einen sehr eingeschränkten Adressraum hat, wird durch den Einsatz einer MMU der Adressraum stark erweitert. |
| | + | Der Adressraum einer Motorola 6809 CPU ist auf 64K beschränkt, man spricht vom '''logischen Adressraum'''. |
| | + | Die MMU hingegen hat einen viel größeren Adressraum von mehreren MB, das bezeichnet man als '''physischen Adressraum'''. |
| | | | |
| − | Für die Motorola 6809 gibt es einen passenden Chip, die '''Motorola MMU 6829'''. Die 6829 sind jedoch heutzutage kaum noch erhältlich. Ziel dieses Projekt ist es, einen 6829 zu ersetzen mit heute noch gut erhältlichen Bauteilen.
| + | Die Idee hinter der MMU ist es, den logischen Adressraum der CPU in kleine Blöcke zu teilen. |
| | + | Jeder Block kann dann irgendwo im physischen Adressraum verschoben werden. |
| | + | Damit steht der gesamte physikalische Adressraum im Zugriff der CPU, natürlich nur Stückweise. |
| | | | |
| | + | Je kleiner die Größe eines Blocks gewählt wird, desto flexibler kann die Sicht auf den physikalische Adressraum gestaltet werden. Allerdings vergrößert sich der Verwaltungsaufwand, je kleiner die Blockgröße gewählt wird. |
| | | | |
| − | <br />
| |
| − | === Motorola MMU 6829 ===
| |
| − |
| |
| − | Die Idee hinter der MMU ist es, den logischen Adressraum der CPU in kleine Blöcke zu teilen. Jeder Block kann dann irgendwo im physischen Adressraum verschoben werden. Damit steht der gesamte physikalische Adressraum im Zugriff der CPU, natürlich nur Stückweise.
| |
| − |
| |
| − | Je kleiner die Größe eines Blocks gewählt wird, desto flexibler kann die Sicht auf den physikalische Adressraum gestaltet werden. Allerdings vergrößert sich der Verwaltungsaufwand, je kleiner die Blockgröße gewählt wird. Im Falle der MMU 6829 ist die Blockgröße exakt 2K, damit hat man 32 Blöcke im logischen Adressraum der CPU.
| |
| | | | |
| − | Bei der MMU 6829 wird der logische Adressraum erweitert von 64K (16 Bit) auf 2MB (21 Bit). Umgesetzt wird das mit einem sehr schnellen SRAM. Dazu werden die obersten 5 Bit der logischen Adresse (LA11 bis LA15) als Adresse für ein 10 Bit SRAM verwendet (RA0 bis RA4). Die 10 Bit Daten im RAM bilden die obersten Bits der physischen Adresse (PA11 bis PA20).
| + | Jeder Speicherzugriff der CPU ist immer ein Zugriff in den logischen Adressraum (64K). |
| | + | Die MMU rechnet jeden Speicherzugriff um, von der logischen Adresse zur physikalischen Adresse. |
| | + | Die Umsetzung von logischer auf physikalischer Adresse erfolgt durch ein sehr schnelles RAM, das 'Mapping RAM' (MRAM). |
| | + | Das ist insbesondere bei einer 3MHz CPU eine ziemliche Herausforderung. |
| | | | |
| | | | |
| | <br /> | | <br /> |
| − | === MMU aus SRAM und CPLD === | + | === Motorola MMU 6829 === |
| − | | |
| − | Die Umsetzung von logischer zu physikalischer Adresse erfolgt also über ein schnelles SRAM. Das SRAM sollte bei einer 3MHz CPU mindestens 12nS Zugriffszeit haben. Besser sind 10nS um auf der sicheren Seite zu sein.
| |
| − | | |
| − | Übliche SRAM mit 10nS Zugriff haben eine Datenbreite von 8 Bit. Also benötigen wir zwei dieser SRAM Bausteine. Die übrigen 6 Bit kann man sinnvoll nutzen, um den physikalischen Adressraum noch weiter zu vergrößern.
| |
| | | | |
| | + | Für die Motorola CPU 6809 gibt es einen passenden Chip, die '''Motorola MMU 6829''' [[MMU-6829|(näheres dazu siehe: MMU-6829)]]. |
| | | | |
| | | | |
| − | {| class="wikitable" style="text-align: center; padding: 10px; "
| + | Die [[MMU-6829]] hat einen physikalischen Adressraum von 2MB (21 Bit). |
| − | |-
| + | Der physikalische Adressraum ist in 1024 Seiten (Pages) zu je 2K (Page $000 bis $3FF) unterteilt. |
| − | ! scope="col" style="text-align: center; padding: 10px; " |
| |
| − | ! scope="col" style="text-align: center; padding: 10px; " | [Motorola 6829]
| |
| − | ! scope="col" style="text-align: center; padding: 10px; " | [MMU-16]
| |
| − | |-
| |
| − | ! scope="row" style="text-align: center; padding: 10px; " | Blockgröße
| |
| − | | 2K
| |
| − | | 2K
| |
| − | |-
| |
| − | ! scope="row" style="text-align: center; padding: 10px; " | Adressraum
| |
| − | | 2MB
| |
| − | | 16MB
| |
| − | |-
| |
| − | ! scope="row" style="text-align: center; padding: 10px; " | Memory Flags
| |
| − | | 0
| |
| − | | 3
| |
| − | |}
| |
| | | | |
| | + | Die CPU hat einen logischen Adressraum von 64KB (16 Bit). |
| | + | Der logische Adressraum ist unterteilt in 32 Blöcke von je 2K. |
| | | | |
| | + | Die [[MMU-6829]] kann 4 Memory MAPs abbilden (4 Tasks). |
| | + | Das Mapping RAM kann von der CPU lesend und schreibend zugegriffen werden. |
| | | | |
| | | | |
| | <br /> | | <br /> |
| | | | |
| − | === CPU Board === | + | === Die MMU-16 === |
| | | | |
| − | == Die Hardware ==
| + | Die MMU 6829 ist heutzutage sehr schwer zu bekommen. |
| | + | Deswegen wurde die [[MMU-16]] entwickelt. [[MMU-16|Näheres dazu siehe: MMU-16]]. |
| | | | |
| | | | |
| − | <br />
| + | Die [[MMU-16]] ist weitgehend kompatibel zur Motorola 6829. |
| − | === Memory MAP ===
| + | Allerdings hat die [[MMU-16]] ein größeres Mapping RAM (2x 8KB). |
| | + | Damit unterstützt die [[MMU-16]] bis zu 256 Tasks. |
| | | | |
| − | Der '''physikalische Adressraum''' hat eine Größe von 2MB. Dem gegenüber steht eine CPU die nur 64K adressieren kann ('''logischer Adressraum'''). Diese Diskrepanz wird gelöst durch den Einsatz einer MMU von Motorola (MC6829).
| + | Zudem hat das MRAM gleich 16 Bit (statt nur 10 Bit bei der 6829). |
| | + | Von den 16 Bit werden 13 Bit für die physikalische Adresse verwendet |
| | + | Damit kann die [[MMU-16]] einen größeren physikalischen Adressraum verwalten (bis zu 16MB). |
| | + | Die restlichen 3 Bit steuern den Speicher Zugriff (lesen, schreiben, ausführen). |
| | + | Damit kann man zum Beispiel eine RAM Seite auf lesenden Zugriff beschränken, sodass es für die CPU wie ROM aussieht. |
| | | | |
| − |
| |
| − | Der Physikalische Adressraum hat eine Größe von 2MB und ist in 1024 Seiten (Pages) zu je 2K (Page $000 bis $3FF) unterteilt.
| |
| − |
| |
| − | Die MMU splittet den logischen Adressraum (64K) auf in 32 Blöcke zu je 2K. Jeder dieser 2K großen Blöcke kann nun irgendwo im physikalischen Adressraum liegen (in 2K Schritten). Es erfolgt also eine Zuordnung von Block zu Page.
| |
| − |
| |
| − | Es sind 32 Blöcke die einem der 1024 Pages zugeordnet werden. Dazu gibt es 32 Zeiger zu je 10 Bit (zwei Bytes), also insgesamt 64 Bytes, die eine ganze Speicherbelegung (Memory Map) beschreiben.
| |
| − |
| |
| − | Die '''Memory MAP''' ermöglicht einen sehr flexiblen Zugriff auf den gesamten physikalischen Adressraum. Zudem kann das Block Mapping dynamisch verändert werden, sodass die CPU stets die gerade wichtigen Teile des physikalischen Adressraum im Zugriff hat.
| |
| − |
| |
| − |
| |
| − | <gallery mode="traditional" widths=250px heights=180px perrow=9 caption="">
| |
| − | Image:Memory-Map-OS9-MMU.png
| |
| − | </gallery>
| |
| | | | |
| | <br /> | | <br /> |
| − | ==== Speicher Schutz ====
| |
| − |
| |
| − | Wenn nur ein Programm läuft, dann braucht man keinen besonderen Schutz des Speicherraum. Ganz anders ist es, wenn man mehrere Programme gleichzeitig laufen lässt (Multitasking). Es erhöht die Stabilität des System ungemein, wenn jedes Programm nur 'seinen eigenen Speicher' im Zugriff hat.
| |
| − |
| |
| − | Das gilt insbesondere auch für den Speicher des Betriebssystem selbst. Wenn Benutzerprogramm in den Speicherbereich des NitrOS9 schreiben können, dann kann es zu Problemen und Abstürze kommen.
| |
| − |
| |
| − | All Ressourcen im System (Bildschirm, IO, Massenspeicher, Kommunikation ...) können bei einer Motorola CPU nur als quasi 'Speicher' zugegriffen werden. Daher ist eine Speicherschutz auch glz. ein Schutz aller Ressourcen im System. Zum Beispiel der Bildschirm RAM, wenn da zwei Programme glz. hinein schreiben, dann wird es wahrscheinlich chaotisch aussehen am Bildschirm den Benutzer.
| |
| − |
| |
| − |
| |
| − | Nun kann die CPU ja nur ihren logischen Adressraum zugreifen. Daraus folgt, die CPU kann im physikalischen Adressraum nur zugeordnete Pages verändern. Letztlich muss also nur der Zugriff auf die MMU selbst beschränkt werden, um einen Speicherschutz zu erreichen.
| |
| − |
| |
| − | Bei der MMU 6829 ist der Zugriff auf die MMU nur im Task #0 möglich. Task #0 ist also der System Task, der die alleinige Kontrolle über das Page Mapping hat. Der Speicherschutz ist folglich alleinige Aufgabe des OS. Das NitrOS9 kann sensible Speicherbereiche einem Programm zuordnen oder eben nicht.
| |
| − |
| |
| − | <br />
| |
| − | ==== Maximale Speicher Nutzung ====
| |
| − |
| |
| − | Unter NitrOS9 Level 1 hatte man nie den vollen logischen Adressraum zur Verfügung. In jedem Fall musste stets ein ROM im obersten Ende des Speicher sein, weil da die Vektoren für Interrupts und SWI stehen und auch der Code dafür musste stets im Zugriff stehen.
| |
| − |
| |
| − | Dank MMU und NitrOS9 Level 2 kann nun jeder Task die gesamten 64K voll RAM haben. Es wird kein einziges Byte verschwendet für ROM oder IO.
| |
| − |
| |
| − |
| |
| − | Möglich wird das durch eine besondere Fähigkeit der MMU, die selbstständig beim Aufruf einen OS9 Service (SWI) oder eines Interrupts automatisch in den System Task #0 schalten kann. Dazu stellt die CPU eigene Signale zur Verfügung, die ermöglichen der MMU die Erkennung, was die CPU gerade so macht. Im Falle eines Interrupt werden die Register auf den User Stack geschrieben, dann schaltet die MMU automatisch auf den Task #0, wodurch das System ROM sichtbar wird. Die CPU lädt den Interrupt Vektor aus dem System ROM und führt den Code aus.
| |
| − |
| |
| − |
| |
| − | Jeder Benutzer Task kann zusätzlichen RAM anfordern vom OS. Über einen Banking Bereich kann man so auch mehr als 64K Speicher zur Verfügung haben. Man kann RAM teilen mit mit anderen Tasks (gemeinsame RAM Bereiche). Es braucht keinen Platz für IO und keinen ROM Bereich in der Memory MAP eines Benutzer Task, es ist aber optional trotzdem noch möglich.
| |
| − |
| |
| − | Der Benutzer Speicher ist geschützt vor Zugriffe eines anderen Benutzer Task. Alles Speicherbereiche des OS und die IO Bereiche sind geschützt vor den Benutzer Tasks.
| |
| − |
| |
| − | <br />
| |
| − |
| |
| − | ==== Spezielle Funktionen der MMU ====
| |
| − |
| |
| − | Durch spezielle Steuersignale von der CPU erkennt die MMU automatisch einen Reset, einen Interrupt (IRQ) oder einen SWI Befehl. Der Task Wechsel ist ein sensibler und komplexer Vorgang. Durch die Änderung der Speicher MAP ändert sich ja unter Umständen gänzlich alles, auch der Stack und User Stack liegt plötzlich an einer ganz anderen physikalischen Adresse. Die MMU zählt CPU Takte, damit die Umschaltung der Speicher MAP immer an dem exakt definierten Zeitpunkt statt findet.
| |
| − |
| |
| − | Der Wechsel zum System Task #0 erfolgt voll automatisch. Die CPU sichert die Register noch in der User MAP und fetched die Vektoren bereits in der System MAP. Dann wird der Code des OS bzw. einer Modul (Hardware Treiber) ausgeführt. Die Rückkehr zum User Task erfolgt in der Regel durch ein RTI. Da muss der RTI Befehl noch aus der System MAP gelesen werden, die Rücksicherung der Register muss aber bereits vom Stack des Benutzer Task erfolgen. Der Zeitpunkt des Task Wechsel in der MMU ist sehr sensibel. Zum Glück übernimmt das NitrOS9 diese Aufgabe.
| |
| − |
| |
| − |
| |
| − | Der Schutz des OS vor Benutzer Code und der Schutz des Benutzer Code vor anderem Benutzer Code erfolgt nur durch das Paging. Der Schlüssel dazu ist die Konfiguration der MMU. Deshalb kann die MMU Konfiguration nur verändert werden durch "privilegierten Code". Die MMU Register sowie der Paging RAM können nur verändert werden, wenn der Task #0 aktiv ist. Mit anderen Worten, für DMA und Benutzerprogramme ist die MMU unsichtbar.
| |
| − |
| |
| − | Nach einem Reset ist die MMU in einem speziellen Modus. Die Adressleitungen PA11 bis PA20 sind high, daher muss das Start ROM im oberen Ende des physikalischen Adressraum liegen. Da liegen auch die MMU Register und der MMU RAM. Bei der NitrOS9 Platine liegt die MMU an der Adresse 1FFF00 bis 1FFF7F (128 Bytes). Es ist egal ob die MMU Register sichtbar sind oder nicht, in diesem Adressbereich ist das ROM immer ausgeblendet.
| |
| − |
| |
| − | Selbst wenn es einem Benutzer Programm gelingt, die Page 1023 einzublenden und so Zugriff auf den Adressen Bereich 1FFF00 bis 1FFF7F zu erlangen, kann das Programm die MMU nicht zugreifen (MMU ist unsichtbar).
| |
| − |
| |
| − | Die MMU Hardware ist wasserdicht, der Speicher ist perfekt geschützt. Nur wenn das OS einen Zugriff erlaubt, hat das Benutzerprogramm einen Zugriff. Die Schwachstelle ist also immer das OS, eine Schadsoftware könnte aber theoretisch Fehler im Systemcode nutzen. Im Normalfall läuft der Benutzer Code in einer sichern Blase, quasi eine virtuelle Umgebung. Es läuft in seiner virtuellen Speicher Welt, die das OS eingestellt hat, und kommt nicht heraus.
| |
| − |
| |
| − | Das Konzept mit der MMU geht schon in die Richtung, die beim PC erst seit dem Intel 386 funktionieren. Der Intel Prozessor ist natürlich 16/32 Bit breit, und hat das ganze Paging voll integriert in der CPU. Aber im Grunde gab es das schon Jahre vorher.
| |
| − |
| |
| − | <br />
| |
| − |
| |
| − | === Inbetriebnahme ===
| |
| − |
| |
| − |
| |
| − |
| |
| − | <br />
| |
| − | == Das Betriebssystem ==
| |
| − |
| |
| − | Zum Einsatz kommt NitrOS9 Level II. Die Basis dafür ist der Quellcode des NitrOS9 für den Tandy CoCo-III. Das NitrOS9 wird angepasst auf die im vorigen Kapitel beschriebene Hardware Plattform (NitrOS9 SBC).
| |
| − |
| |
| − |
| |
| − | <br />
| |
| − | === Start Sequenz ===
| |
| − |
| |
| − | Nach einem Reset fetched die CPU den RESET Vektor von der logischen Adresse $FFFE und führt den Code aus. Die MMU ist nach einem RESET in einem speziellen Modus. Die Adressleitungen PA11 bis PA20 sind high, daher wird der Reset Vektor gelesen von der physischen Adresse $1FFFFE. Es läuft privilegierter Code, die MMU Konfig Register sind in der Page 1023 sichtbar.
| |
| − |
| |
| − | Das erste was die CPU nun zu tun hat, ist die Konfiguration der MMU. Sonst hat man keinen Zugriff außerhalb der Page 1023. Die MMU bekommt nun die Konfiguration unter der NitrOS9 laufen kann. Dann wird der Kern Code gestartet. Je nach Art des NitrOS9 ist entweder das gesamte OS im ROM (20K) oder nur der Kern (4K).
| |
| − |
| |
| − | <br />
| |
| − |
| |
| | == News == | | == News == |
| | | | |
| Zeile 150: |
Zeile 62: |
| | | | |
| | <br /> | | <br /> |
| − |
| |
| | == Downloads == | | == Downloads == |
| | | | |
MMU - Memory Management Unit
Eine MMU verwaltet den Verfügbaren Arbeitsspeicher eines Computer System. Im Falle einer 8 Bit CPU, die einen sehr eingeschränkten Adressraum hat, wird durch den Einsatz einer MMU der Adressraum stark erweitert.
Der Adressraum einer Motorola 6809 CPU ist auf 64K beschränkt, man spricht vom logischen Adressraum.
Die MMU hingegen hat einen viel größeren Adressraum von mehreren MB, das bezeichnet man als physischen Adressraum.
Die Idee hinter der MMU ist es, den logischen Adressraum der CPU in kleine Blöcke zu teilen.
Jeder Block kann dann irgendwo im physischen Adressraum verschoben werden.
Damit steht der gesamte physikalische Adressraum im Zugriff der CPU, natürlich nur Stückweise.
Je kleiner die Größe eines Blocks gewählt wird, desto flexibler kann die Sicht auf den physikalische Adressraum gestaltet werden. Allerdings vergrößert sich der Verwaltungsaufwand, je kleiner die Blockgröße gewählt wird.
Jeder Speicherzugriff der CPU ist immer ein Zugriff in den logischen Adressraum (64K).
Die MMU rechnet jeden Speicherzugriff um, von der logischen Adresse zur physikalischen Adresse.
Die Umsetzung von logischer auf physikalischer Adresse erfolgt durch ein sehr schnelles RAM, das 'Mapping RAM' (MRAM).
Das ist insbesondere bei einer 3MHz CPU eine ziemliche Herausforderung.
Motorola MMU 6829
Für die Motorola CPU 6809 gibt es einen passenden Chip, die Motorola MMU 6829 (näheres dazu siehe: MMU-6829).
Die MMU-6829 hat einen physikalischen Adressraum von 2MB (21 Bit).
Der physikalische Adressraum ist in 1024 Seiten (Pages) zu je 2K (Page $000 bis $3FF) unterteilt.
Die CPU hat einen logischen Adressraum von 64KB (16 Bit).
Der logische Adressraum ist unterteilt in 32 Blöcke von je 2K.
Die MMU-6829 kann 4 Memory MAPs abbilden (4 Tasks).
Das Mapping RAM kann von der CPU lesend und schreibend zugegriffen werden.
Die MMU-16
Die MMU 6829 ist heutzutage sehr schwer zu bekommen.
Deswegen wurde die MMU-16 entwickelt. Näheres dazu siehe: MMU-16.
Die MMU-16 ist weitgehend kompatibel zur Motorola 6829.
Allerdings hat die MMU-16 ein größeres Mapping RAM (2x 8KB).
Damit unterstützt die MMU-16 bis zu 256 Tasks.
Zudem hat das MRAM gleich 16 Bit (statt nur 10 Bit bei der 6829).
Von den 16 Bit werden 13 Bit für die physikalische Adresse verwendet
Damit kann die MMU-16 einen größeren physikalischen Adressraum verwalten (bis zu 16MB).
Die restlichen 3 Bit steuern den Speicher Zugriff (lesen, schreiben, ausführen).
Damit kann man zum Beispiel eine RAM Seite auf lesenden Zugriff beschränken, sodass es für die CPU wie ROM aussieht.
News
Downloads
Links