ROMSPEED und virtuelle Speicherverwaltung: Zusammenarbeit ist Trumpf

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.

Ausweg

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.

Bitte ein Bit

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.

RAM-Einsparung

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.

Vorsicht vor System-Programmierung

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

Uwe Seimet
Aus: ST-Computer 09 / 1991, Seite 148

Links

Copyright-Bestimmungen: siehe Über diese Seite