Übersicht

Das ASICMMU enthält neben der Steuerung für den virtuellen Speicher auch Einrichtungen zur Sicherung der Systemintegrität. Zur Beeinflussung der Arbeitsweise enthält der Baustein 2 Register, welche durch den Prozessor ausgelesen und abhängig von bestimmten Bedingungen auch verändert werden können. Das ASID-Register speichert im virtuellen Zugriffsmodus die ID des gerade aktiven Adressraumes. Über das Control-Register können einzelne Funktionen des ASICMMU einzeln aktiviert werden.

Warum virtuelle Adressierung ?

Man mag fragen, warum ich für den PC65816 V2 die Möglichkeit der virtuellen Adressierung vorgesehen habe. Doch wenn man bedenkt, dass dieser Rechner mit für 65XX-Einplatinensysteme relativ üppigen 4 MB Hauptspeicher ausgestattet ist und das System für Multitasking-Betrieb vorgesehen ist, so stößt man bei der direkten Adressierung von Arbeitsspeicher vor allen Dingen auf zwei Probleme. Die Speicherbereiche von unterschiedlichen Tasks sollen möglicherweise getrennt sein, damit ein Fehler in der einen Task nicht zu Beeinträchtigung anderer Verarbeitungen auf dem Rechner führt. Daneben kann es im Multitaskingbetrieb durch vielfache Speicherreservierungen und -freigaben zu einer starken Fragmentierung des Arbeitsspeichers kommen. Diese Probleme kann die Nutzung einer virtuellen Adressierung beheben.

Arbeitsweise der virtuellen Adressierung

Der Speicher wird in 128 gleich große Segmente von je 32 kB aufgeteilt. Die oberen Adressleitungen des Prozessors werden nicht direkt mit den Adressleitungen des Speichers verbunden, sondern mit den Adressleitungen eines besonderen RAM-Bausteins (VSRAM). Die Datenleitungen des VSRAM wiederum werden zur Adressierung des Arbeitsspeichers verwendet. Der Inhalt des VSRAM ist daher für die effektiven Speicheradressen von essentieller Bedeutung. Die obersten verwendeten Adressleitungen des VSRAM werden durch den Inhalt des ASID-Registers angesteuert. Je 32 kB virtueller Speicherseite wird 1 Byte im VSRAM belegt. Die virtuellen Adressräume können jeweils 4 MB groß werden. Damit belegt jeder virtuelle Adressraum 128 Bytes im VSRAM. Bei 128 möglichen Adressräumen werden maximal 16.384 Bytes im VSRAM verwendet. Für die Ermittlung der jeweils realen Speicheradresse sind die RAM-Adressen A22 und A23 immer 0, da der RAM-Speicher sich in den unteren 4 MB des realen Adressbereichs befindet. Die RAM-Adressleitungen A15-A21 werden durch die Datenleitungen D0-D6 des VSRAM gesteuert. D7 des VSRAM hat eine besondere Bedeutung. Ist dieses Bit gleich 1, dann ist der Schreibzugriff auf diese virtuelle 32 kB-Seite nicht erlaubt. Er wird von der Speichersteuerung physisch unterbunden und kann, wenn diese Funktion im Control-Register aktiviert ist, zur Aktivierung des ABORT-Signals führen. Über das Control-Register lässt sich gesondert eine Schutzfunktion aktivieren, über die eine Programmausführung aus einem Schreiblese-Segment verhindert und ebenfalls ein ABORT ausgelöst wird. Das reale Segment 0 ($000000-$007FFF) ist nur für Schreiblese-Betrieb vorgesehen. Darum kann im VSRAM das Datum $80 nicht legal vorkommen. Dieser Wert wird daher zur Kennzeichnung einer ungültigen Seite verwendet. Der Zugriff auf ein solches Segment führt zum ABORT. Auch der Zugriff auf Adressen oberhalb von 4 MB führt im User-Modus (was das ist, wird weiter unten beschrieben) zum ABORT. Es ist Aufgabe des Betriebssystems, die VSRAM-Tabellen zu pflegen und den ABORT-Vektor mit einer geeigneten Verarbeitungsroutine zu belegen. Nach einem Reset ist die virtuelle Speicherverwaltung zunächst nicht aktiv. Dies erlaubt der Systemsoftware den Aufbau der nötigen Tabellen im VSRAM. Bei DMA-Zugriffen wird übrigens immer real adressiert, da diese in keinem definierten Programmkontext ablaufen, sondern parallel und unabhängig davon. Daher ist der Zustand des ASID-Registers zu diesem Zeitpunkt nicht absehbar.

 

CPU

CPU
D[0..7]
------->
ASICMMU
A[16..23]

CPU A15

ASICMMU VSRAM
ASICMMU
ASICMMU
ASID[0..6]
----------->
VSRAM
A[7..13]
VSRAM
D[0..6]
----------->
ASICMMU
VS[0..6]
ASICMMU
MUX[15..21]
----------->
RAM
A[15..21]
ASICMMU
A[15..21]
----------->
VSRAM
A[0..6]
CPU [A0..A14] --------------> RAM [A0..A14]
RAM

schematische Darstellung der Adressaufbereitung im virtuellen Speichermodus

System- und User-Modus

Über das Control-Register kann das System vom System in den User-Modus geschaltet werden. In diesem Modus greifen dann verschiedene Einschränkungen für das Programm. Der Zugriff auf Adressen oberhalb der ersten 4 MB ist nicht mehr möglich und führt zu einem ABORT. Da sich alle Adressen von Steuerregistern und Ein-/Ausgabeeinheiten oberhalb dieser Grenze befinden, ist in diesem Modus kein direkter Zugriff darauf mehr möglich. Selbst ein Zurückschalten per Software in den System-Modus ist ausgeschlossen. Der einzige Weg vom User- in den System-Modus führt über eine Soft- oder Hardware-Unterbrechungsanfrage. In diesem Fall holt sich der Prozessor die entsprechenden Sprungvektoren aus dem Speicher und dieser Vorgang löst über die Vector-Pull-Leitung des Prozessors einen Wechsel zurück in den System-Modus aus. Damit hat man für die Systemprogrammierung genau definierte Schnittstellen zur Verfügung.

Weitere Schutzmechanismen

Neben der Veränderung von fremdem Speicher kann ein Programm über bestimmte Instruktionen ebenfalls die Systemstabilität gefährden. Daher können die Instruktionen SEI, STP, WAI und XCE im User-Modus abgefangen werden. Am Datenbus wird stattdessen der NOP-Opcode eingeblendet und ein NMI-Interrupt ausgelöst.

MMU-Register

Das ASID-Register hat die Adresse $F88000 und verwendet die Bits 0-6 zur Darstellung von maximal 128 Adressräumen. Das ASID-Register ist für Schreib- und Lesezugriff ausgelegt.

Das Control-Register hat die Adresse $F88001. Sein Aufbau ist in der folgenden Tabelle dargestellt.

 

D7

R/W

0 = keine virtuelle Adressierung, 1 = virtuelle Adressierung aktiv

D6

R/W

0 = EPROM aktiviert, 1 = EPROM ausgeblendet

D5

R/W

0 = keine NMI-Auslösung, 1 = NMI-Verarbeitung aktiviert

D4

R/W

0 = keine ABORT-Auslösung, 1 = ABORT-Verarbeitung aktiviert

D3

R

Grund für ABORT-Auslösung: 00 = Zugriff außerhalb RAM im User-Mode, 01 = Schreibversuch in Nur-Lesesegment, 02 = Programmausführung aus Schreib-Lese-Segment, 03 = Zugriff auf ungültiges Segment ($80)

D2

R

D1

R/W

0 = Programmausführung aus R/W-Segment erlaubt, 1 = dto. verboten

D0

R/W

0 = System-Modus, 1 = User-Modus

Das VSRAM belegt die Adressen ab $F80000 aufwärts. Es unterstützt Schreib- und Lesezugriffe und die Tabellen haben folgenden Aufbau:

$F80000-
$F8007F

ASID 0
$000000-$007FFF

ASID 0
$008000-$00FFFF

......

ASID 0
$3F0000-$3F7FFF

ASID 0
$3F8000-$3FFFF

$F80080-
$F800FF

ASID 1
$000000-$007FFF

ASID 1
$008000-$00FFFF

......

ASID 1
$3F0000-$3F7FFF

ASID 1
$3F8000-$3FFFF

..............................

...............................

...............................

......

................................

...............................

$F83F00-
$F83F7F

ASID 126
$000000-$007FFF

ASID 126
$008000-$00FFFF

......

ASID 126
$3F0000-$3F7FFF

ASID 126
$3F8000-$3FFFF

$F83F80-
$F83FFF

ASID 127
$000000-$007FFF

ASID 127
$008000-$00FFFF

......

ASID 127
$3F0000-$3F7FFF

ASID 127
$3F8000-$3FFFF

Das Äquivalenzschaltbild der Funktionen des ASICMMU steht hier zum Download zur Verfügung.