In der Regel ist es nicht möglich, daß mehrere Programme die integrierte PMMU des 68030-Prozessors gleichzeitig nutzen. Dem muß aber nicht so sein. Entscheidend ist, daß solche Programme voneinander wissen und dementsprechend reagieren.
Das Programm ROMSPEED wurde in [1] vorgestellt. Es nutzt die MMU dazu, das komplette ROM des TT im schnellen TT-RAM ablaufen zu lassen und so einen Geschwindigkeitsvorteil zu erzielen. Wünschenswert wäre es, ROMSPEED in Verbindung mit dem Programm OUTSIDE einzusetzen, das eine virtuelle Speicherverwaltung auf dem TT ermöglicht [2]. (Bei diesem Verfahren wird eine Festplatte quasi als Speichererweiterung mißbraucht, so daß man ohne zusätzliche Hardware mit bis zu 128 MByte TT-RAM arbeiten kann.) Bisher war dies aus einem leicht einsichtigen Grund nicht möglich: Es darf nicht passieren, daß Teile des TOS auf Platte ausgelagert werden. Ein Absturz ist so geradezu vorprogrammiert. Zwar läßt sich ROMSPEED auch im ST-RAM, das nicht virtuell verwaltet werden kann, installieren, aber so wäre der Geschwindigkeitsgewinn dahin.
OUTSIDE erlaubt es, einzelne Speicherseiten des TT-RAMs gegen das Auslagem auf Platte zu schützen. Welche Programme können von dieser Möglichkeit profitieren?
In erster Linie wird es sich hierbei um resetfeste Programme handeln, die sich im TT-RAM verankern. Nach einem Reset darf es nicht Vorkommen, daß sich ein resetfestes Programm aufgrund der virtuellen Speicherverwaltung nicht im Hauptspeicher, sondern auf der Festplatte befindet. Versucht die Reset-Routine, ein solches Programm aufzurufen, springt der Prozessor mit ziemlicher Sicherheit ins Leere.
Eine weitere Kategorie von Programmen, die tunlichst nicht von der virtuellen Verwaltung des TT-RAM erfaßt werden darf, sind einige residente Programme, die ständig im Speicher anwesend sein müssen. OUTSIDE selber zählt mit dazu, falls es ins schnelle RAM geladen wurde.
Nun ist ROMSPEED zwar weder reset-fest, noch ist das eigentliche Programm resident, es hinterläßt aber Daten, die ständig im Speicher anwesend sein müssen. Hierbei handelt es sich um die RAM-Kopie des Betriebssystems. Es ist unbedingt notwendig, das Auslagern dieser Informationen zu verhindern. Kümmert man sich nicht darum, wird man die Erfahrung machen, daß sich mit einem Rechner ohne Betriebssystem nicht gut arbeiten läßt. Ein Systemabsturz wird nicht lange auf sich warten lassen.
Jede von ROMSPEED für die Kopie des TOS reservierte Speicherseite wird über einen Seiten-Deskriptor beschrieben. Die Abbildung verdeutlicht noch einmal den Aufbau eines solchen Deskriptors.
Die meisten Deskriptor-Bits werden von der PMMU des 68030 verwendet. Beträgt die Größe eine Speicherseite 32 kByte, so sind die Bits 16 bis 23 der physikalischen Seitenadresse jedoch unbelegt und stehen für eigene Anwendungen zur Verfügung. OUTSIDE reserviert sich die unteren sieben dieser Bits. Das achte Bit steht für andere Programme zur Verfügung.
Entscheidend für uns ist Bit 16. Dieses Bit teilt OUTSIDE mit, ob die Speicherseite, die durch den entsprechenden Deskriptor beschrieben wird, ausgelagert werden darf. Ist das Bit gesetzt, verbleibt die Seite im Speicher, wird also nicht in die virtuelle Speicherverwaltung eingebunden. ROMSPEED nutzt in der neuen Version dieses Bit, um sich fest im Speicher des TT zu verankern.
Von der Unterstützung der virtuellen Speicherverwaltung abgesehen, wurde ROMSPEED in einem zusätzlichen Punkt erweitert. Das Programm legt nun nicht mehr den gesamten ROM-Bereich ins RAM, sondern nur noch den Teil, der tatsächlich mit Code belegt ist. Obwohl der TT bis zu 512 kByte ROM ansprechen kann, sind momentan nämlich nur ca. 260 kByte genutzt. Die restlichen Bytes sind leer und brauchen nicht ins RAM kopiert zu werden. Somit werden deutlich weniger als 512 kByte RAM von ROMSPEED verschlungen. Daß noch viel Leerraum in den TT-ROMs vorhanden ist, kann für die Zukunft sehr interessant sein. Sollte Atari das TT-TOS einmal gründlich erweitern wollen, wird es keine Platzprobleme geben.
Was das vorgestellte Programm betrifft, ist neben dem Assembler-Quelltext ein entsprechendes BASIC-Listing abgedruckt, das auch den Lesern, die keinen Assembler besitzen, die Nutzung von ROMSPEED ermöglicht.
Zu beachten ist, daß OUTSIDE stets vor ROMSPEED gestartet werden muß. Im nachhinein kann ROMSPEED schließlich nicht mehr verhindern, daß die Speicherseiten, die das Betriebssystem enthalten, ausgelagert werden.
Wie man sieht, kann es schnell zu Kollisionen kommen, wenn Programme sich auf unterster Ebene ins System einklinken. Die MMU-Programmierung ist in diesem Zusammenhang besonders kritisch, da es für den TT hierzu keinerlei Richtlinien gibt. Auf anderen Systemen bleibt die Nutzung der MMU eigentlich dem Betriebssystem Vorbehalten und ist nicht Sache des Anwenders. Aus diesem Grund sollte man es sich zweimal überlegen, bevor man sich daran macht, systemnahe Komponenten des TT am Betriebssystem vorbei zu programmieren. Die Wahrscheinlichkeit, daß solche Programme auf einem eventuellen TT-Nachfolger nicht mehr funktionieren, ist äußerst groß.
US
Literatur:
[1] „TT-Tuning - Speed without the price ", ST-Computer 3/91
[2] „Virtuelle Speicherverwaltung - Eine Fallstudie", ST-Computer 7,8191
*******************************
* *
* ROMSPEED V1.2 *
* *
* verlegt ROM ins TT-RAM, *
* *
* unterstützt virtuelle *
* *
* Speicherverwaltung OUTSIDE *
* *
* (C) Juli 1991 by Uwe Seimet *
*******************************
LOCKED = 0
GEMDOS = 1
CCONWS = 9
PTERMRES = 49
XBIOS = 14
SUPEXEC =38
_p_cookies = $5a0 ;Pointer auf
;cookie-jar
text
pea super(pc)
move #SUPEXEC,-(sp)
trap #XBIOS
addq.l #6,sp
lea ttonly,a3
tst.b stfig ;Atari ST?
bne.b error ;ja-
lea mmuerr,a3
tst.b mmuflg ;MMU bereits aktiv?
beq nommu :nein-
tst.b swapflg ;OUTSIDE?
beq.b error ;nein-
nommu: pea message
move #CCONWS,-(sp)
trap #GEMDOS ;Meldung ausgeben
addq.l #6,sp
tst.b ramflg ;bereits
;installiert?
bne.b quit ;33-
move.l rompnt,a1 ;neue
;ROM-Startadresse
sub.l #mem,a1
add.l romlen,a1 ;512K Speicher
;reservieren
move.l 4(sp),a0 ;Basepage-Adresse
add.l 12(a0),a1 ;TEXT-Segment
lea $100(a1),a1 ;Basepage-Länge
clr -(sp)
pea (a1)
move #PTERMRES,-(sp) ;Programm
trap #GEMDOS ;resident halten
error:
pea (a3) ;Fehlermeldung
move #CCONWS,-(sp)
trap #GEMDOS
addq.l #6,sp
quit: pea notinst
move #CCONWS,-(sp)
trap #GEMDOS
addq.l #6, sp
clr -(sp)
trap #GEMDOS
super:
move.l _p_cookies,d0 ;cookie jar
;vorhanden?
seq stflg
beq exit ;nein-
move.l d0,a0
loop: movem.l (a0)+,d0-d1
tst.l d0 ;Ende der Liste?
beq.b cend ;ja-
cmp.l #"_MCH",d0 ;cookie für Computertyp ?
bne nomch ;nein-
cmp.l #$00020000,d1 ;TT oder neuer?
scs stflg
bra loop
nomch: cmp.l #"_CPU",d0
bne nocpu
cmp #30,d1 ;68030?
bne exit ;nein-
bra loop
nocpu: cmp.l #"SWAP",d0 ;OUTSIDE?
bne notout ;nein-
st swapflg
bra loop
notout: cmp.l #"PMMU",d0 ;sonstiges MMU-Programm?
bne loop ;nein-
st mmuflg
bra loop
cend: tst.b stflg
bne exit
tst.b swapflg
bne outside
tst.b mmuflg
bne exit
outside:cmp #$00e0,$7f8 ;ROMSPEED bereits
;installiert?
sne ramflg
bne exit ;ja-
move.l #mem+32768,d1
and #$8000,d1 ;neue ROM-Adresse
;auf Pagegrenze
;ausrichten
move.l d1,rompnt ;und merken
move.l d1,a0 ;Prüfsummen
lea $00e80000-8,a1 ;überspringen
getlen: cmp.l #$ffffffff,-(a1) ;Leerbytes
beq getlen ;überspringen
sub.l #$00dffffc,a1
move.l a1,romlen
move.l a1,d0
lsr.l #2,d0
lea $00e00000,a1 ;ROM-Adresse
copy: move.l (a1)+,(a0)+ ;ins RAM kopieren
subq.l #1,d0
bpl copy
or #5,d1 ;Page-Deskriptor
;markieren und
;schreibschützen
move.l d1,$7f8 ;in Deskriptor-
;Tabelle eintragen
pflusha ;DC.L $F0002400
tst.b swapflg ;OUTSIDE
;installiert?
beq.b exit ;nein-
move.l rompnt,a1
move.l a1,d0
add.l romlen,d0
lock: ptestr #7,(a1),#7,a0 ;Deskriptoradresse
;ermitteln
;DC.L $F0119F17
bset #LOCKED,2(a0) ;Systemkopie gegen
lea ($8000,a1),a1 ;Auslagern sperren
cmp.l a1, d0
bcc lock
exit: rts
data
message:dc b $0d,$0a
dc.b "ROMSPEED V1.2 installiert",$0d,$0a
dc.b "by Uwe Seimet",$0d,$0a, $00
notinst:dc.b $0d,$0a
dc.b "ROMSPEED V1.2 nicht "
dc.b "installiert! ",$0d,$0a,$00
ttonly: dc.b $0d,$0a
dc.b "ROMSPEED läuft nur "
dc.b "auf dem Atari TT"
dc.b $0d,$0a,$00
mmuerr: dc.b $0d,$0a
dc.b "Es ist bereits ein "
dc.b "MMU-Programm aktiv'"
dc.b $0d,$0a,$00
bss
mem: ds.b 557056 ;512K + 32K
rompnt: ds.l 1 ;Pointer auf ROM-Kopie
romlen: ds.l 1 ;Größe des ROM
swapflg:ds.b 1 ;Flag für OUTSIDE
ramflg: ds.b 1 ;Flag für Zweitinstallation
stflg ds.b 1 ;Flag für Atari ST
mmuflg: ds.b 1 ;Flag für aktives MMU- Programm
' ROMSPEED.PRG Lader
filename$= "ROMSPEED.PRG"
OPEN "O",1,Filename$
READ Wert
REPEAT
PRINT #1, CHR$(Wert);
Summe=Summe+Wert
READ Wert
UNTIL Wert=-1
READ Pruefsumme
IF Pruefsumme<>Summe THEN
PRINT "Fehler In Datas"
ENDIF
CLOSE(1)
Data 96, 26, 0, 0, 1, 138, 0, 0, 0, 172
Data 0, 8, 160, 12, 0, 0, 0, 0, 0, 0
Data 0, 0, 0, 0, 0, 7, 0, 0, 72, 122
Data 0, 136, 63, 60, 0, 38, 78, 78, 92, 143
Data 71, 249, 0, 0, 1, 227, 74, 57, 0, 8
Data 130, 64, 102, 84, 71, 249, 0, 0, 2, 11
Data 74, 57, 0, 8, 130, 65, 103, 8, 74, 57
Data 0, 8, 130, 62, 103, 62, 72, 121, 0, 0
Data 1, 138, 63, 60, 0, 9, 78, 65, 92, 143
Data 74, 57, 0, 8, 130, 63, 102, 50, 34, 121
Data 0, 8, 130, 54, 147, 252, 0, 0, 2, 54
Data 211, 249, 0, 8, 130, 58, 32, 111, 0, 4
Data 211, 232, 0, 12, 67, 233, 1, 0, 66, 103
Data 72, 81, 63, 60, 0, 49, 78, 65, 72, 83
Data 63, 60, 0, 9, 78, 65, 92, 143, 72, 121
Data 0, 0, 1, 190, 63, 60, 0, 9, 78, 65
Data 92, 143, 66, 103, 78, 65, 32, 56, 5, 160
Data 87, 249, 0, 8, 130, 64, 103, 0, 0, 242
Data 32, 64, 76, 216, 0, 3, 74, 128, 103, 72
Data 176, 188, 95, 77, 67, 72, 102, 14, 178, 188
Data 0, 2, 0, 0, 85, 249, 0, 8, 130, 64
Data 96, 226, 176, 188, 95, 67, 80, 85, 102, 10
Data 178, 124, 0, 30, 102, 0, 0, 194, 96, 208
Data 176, 188, 83, 87, 65, 80, 102, 8, 80, 249
Data 0, 8, 130, 62, 96, 192, 176, 188, 80, 77
Data 77, 85, 102, 184, 80, 249, 0, 8, 130, 65
Data 96, 176, 74, 57, 0, 8, 130, 64, 102, 0
Data 0, 150, 74, 57, 0, 8, 130, 62, 102, 10
Data 74, 57, 0, 8, 130, 65, 102, 0, 0, 132
Data 12, 120, 0, 224, 7, 248, 86, 249, 0, 8
Data 130, 63, 102, 116, 34, 60, 0, 0, 130, 54
Data 194, 124, 128, 0, 35, 193, 0, 8, 130, 54
Data 32, 65, 67, 249, 0, 231, 255, 248, 12, 161
Data 255, 255, 255, 255, 103, 248 147, 252, 0, 223
Data 255, 252, 35, 201, 0, 8, 130, 58, 32, 9
Data 228, 136, 67, 249, 0, 224, 0, 0, 32, 217
Data 83, 128, 106, 250, 130, 124, 0, 5, 33, 193
Data 7, 248, 240, 0, 36, 0, 74, 57, 0, 8
Data 130, 62, 103, 36, 34, 121, 0, 8, 130, 54
Data 32, 9, 208, 185, 0, 8, 130, 58, 240, 17
Data 159, 23, 8, 232, 0, 0, 0, 2, 67, 241
Data 1, 112, 0, 0, 128, 0, 176, 137, 100, 234
Data 78, 117, 13, 10, 82, 79, 77, 83, 80, 69
Data 69, 68, 32, 86, 49, 46, 50, 32, 105, 110
Data 115, 116, 97, 108,, 108, 105, 101, 114, 116, 13
Data 10, 189, 32, 49, 57, 57, 49, 32, 98, 121
Data 32, 85, 119, 101, 32, 83, 101, 105, 109, 101
Data 116, 13, 10, 0, 13, 10, 82, 79, 77, 83
Data 80, 69, 69, 68, 32, 86, 49, 46, 50, 32
Data 110, 105, 99, 104, 116, 32, 105, 110, 115, 116
Data 97, 108, 108, 105, 101, 114, 116, 33, 13, 10
Data 0, 13, 10, 82, 79, 77, 83, 80, 69, 69
Data 68, 32, 108, 132, 117, 102, 116, 32, 110, 117
Data 114, 32, 97, 117, 102, 32, 100, 101, 109, 32
Data 65, 116, 97, 114, 105, 32, 84, 84, 13, 10
Data 0, 13, 10, 69, 115, 32, 105, 115, 116, 32
Data 98, 101, 114, 101, 105, 116, 115, 32, 101, 105
Data 110, 32, 77, 77, 85, 45, 80, 114, 111, 103
Data 114, 97, 109, 109, 32, 97, 107, 116, 105, 118
Data 33, 13, 10, 0, 0, 0, 0, 14, 6, 8
Data 6, 8, 8, 14, 8, 6, 6, 38, 22, 34
Data 34, 16, 8, 10, 8, 16, 8, 10, 28, 34
Data 8, 8, 0
Data -1
Data 47209