Back To The Roots: Ein etwas anderer Boot-Selektor

Für Besitzer einer Festplatte ist es seit langem selbstverständlich: Nach dem Einschalten des Atari werden AUTO-Ordner und Accessories automatisch von Laufwerk C: gebootet. Gesteuert wird der Boot-Vorgang durch ein Programm im Root-Sektor der Platte. Ein Standard-Root-Programm stellt allerdings nicht immer das Optimum dar. Bei einigen Systemkonfigurationen ist Eigeninitiative gefragt.

So auch für den Fall, daß sich das UNIX-Atari-System V (AS V) und TOS auf der gleichen Festplatte befinden. Dem ASV liegt ein kleines Programm mit dem Namen SETBOOT bei, das es erlaubt, eine Boot-Präferenz einzustellen. Der Anwender hat die Wahl zwischen TOS oder UNIX. Soweit, so gut. Nun ist es aber reichlich mühsam, beim Wechseln zwischen beiden Systemen zunächst von Diskette zu booten, die Boot-Präferenz mit SETBOOT zu ändern und anschließend das voreingestellte System von Platte zu booten. Genau das ist jedoch die Vorgehensweise, wie sie von Atari vorgesehen ist. Eine komfortable Lösung besteht darin, auf SETBOOT zu verzichten und während des Boot-Vorgangs zu entscheiden, ob UNIX oder TOS zum Zuge kommen soll. Eine kleine Modifikation im Root-Programm der UNIX-Platte ermöglicht dies.

Disketten haben Priorität

Zunächst sollte man sich jedoch vor Augen führen, wie der Boot-Vorgang prinzipiell abläuft. Die einzelnen Schritte sind für Atari ST und TT nahezu die gleichen.

Nach dem Einschalten oder einem Reset wird vor dem ersten Festplattenzugriff erst einmal überprüft, ob sich auf dem Boot-Sektor der Diskette in Laufwerk A: ein ausführbares Programm befindet. Wer sich an die Zeiten erinnert, als der Atari 520ST ohne ROMs ausgeliefert wurde, weiß sicher noch, wofür ein solches Programm gut sein kann: Damals wurde mit Hilfe des Boot-Programms das TOS von Diskette geladen. Heutzutage spielen Programme im Boot-Sektor einer Diskette eher eine untergeordnete Rolle. In erster Linie findet man ausführbare Boot-Sektoren bei Spieledisketten, die sich lediglich beim Einschalten des Rechners in Laufwerk A: befinden müssen, um ein Spiel automatisch zu starten. Das Desktop bekommt man dabei gar nicht erst zu Gesicht. Eine weniger erfreuliche Anwendung von Boot-Programmen sind Boot-Sektor-Viren, die sich beim Ausführen des Boot-Sektors im Rechner installieren, um sich anschließend auf weitere Disketten zu verbreiten.

Im TOS 3.06 findet sich übrigens ein Fehler, der dafür sorgt, daß nicht von Disketten doppelter Dichte gebootet wird, falls ein zweites Laufwerk am TT angeschlossen ist. Bei HD-Disketten dagegen verläuft der Boot-Vorgang normal.

Die Festplatte kommt ins Spiel

Falls das Boot-Programm nach seiner Beendigung ins Betriebssystem zurückkehrt, wird der Versuch unternommen, von Platte zu booten. (Dies gilt natürlich auch dann, wenn keine Diskette eingelegt war oder kein ausführbarer Boot-Sektor gefunden wurde.) TOS lädt den ersten Sektor (Root-Sektor) der ersten angeschlossenen Festplatte und prüft diesen auf ein ausführbares Programm. Dabei haben beim Atari TT Platten am SCSI-Bus Priorität vor ACSI-Platten, so daß der Root-Sektor in der Regel von der internen Festplatte geladen wird.

Der Code im Root-Sektor entscheidet über den weiteren Verlauf des System-starts. Das Root-Programm prüft, ob eine der ersten vier Partitionen der Platte, deren Daten im Root-Sektor vermerkt sind, als ausführbar markiert ist. Ist dies nicht der Fall, werden die Programme im AUTO-Ordner der Diskette in Laufwerk A: gestartet, es wird also nicht von Platte gebootet. Findet das Rootprogramm jedoch eine bootfähige Partition, wird der entsprechende Boot-Sektor geladen und das Boot-Programm ausgeführt. Dieses lädt bei TOS-Partitionen den Festplattentreiber, der dann auch auf weitere angeschlossene Platten testet und diese ins System einbindet. Falls es sich bei der ersten ausführbaren Partition um eine UNIX-Partition handelt, befindet sich im Boot-Sektor ein Programm, das für den Start des UNIX-Systems verantwortlich ist.

Sicherheit durch Prüfsumme

Bisher war des öfteren die Rede von „ausführbaren“ Sektoren. Nun stellt sich natürlich die Frage, woran TOS erkennt, wann ein ausführbarer Boot- oder Root-Sektor vorliegt. Daß es hierfür ein Kriterium geben muß, liegt auf der Hand. Schließlich muß das Betriebssystem vor dem Einsprung in den Boot-Sektor sicherstellen, daß dort überhaupt sinnvoller Programmcode vorhanden ist.

Der erste Hinweis auf eine bootfähige Partition findet sich bereits im Root-Sektor der Platte. Für bis zu vier Partitionen finden sich hier neben Angaben über Startsektor und Größe Bit-Vektoren, die die Eigenschaften der Partition näher beschreiben. Jeder Partition sind dabei 3 Bits wie folgt zugeordnet:

Bit 0: Partitionsdaten sind gültig
Bit 6: bootfahige UNIX-Partition
Bit 7: bootfähige TOS-Partition

Die restlichen Bits sind reserviert und haben zur Zeit keine Bedeutung. Findet das Root-Programm nun eine ausführbare Partition (Bit 0 und entweder Bit 6 oder 7 müssen hierzu gesetzt sein), wird deren Boot-Sektor geladen und nochmals auf Ausführbarkeit überprüft. Die zusätzliche Absicherung erfolgt mit Hilfe einer Prüfsumme über alle Wörter des Sektors. Ergibt deren Summe den Wert $1234, geht TOS davon aus, das sich im Boot- oder Root-Sektor ein Programm befindet, daß beim Systemstart aufgerufen werden soll. Unangenehm wird es natürlich dann, wenn trotz korrekter Prüfsumme Müll im Root-Sektor der Festplatte steht. Dann nämlich stürzt das System beim Boot-Vorgang ab, und es stellt sich die Frage, vie man eine Lösung für dieses Dilemma findet. Neu-Booten bringt hier nämlich gar nichts, der nächste Absturz ist schon vorprogrammiert. Atari hat zwar vorgesehen, das Booten von Platte dann zu unterbinden, wenn in der Boot-Phase die [Altemate]-Taste gedrückt gehalten wird, doch dummerweise wird die Tastatur erst vom Root-Programm abgefragt, und nicht schon vorher.

Bei einem defekten Programm im Root-Sektor läßt sich der Boot-Vorgang somit nur dann fortsetzen, wenn das Root-Programm gar nicht erst ausgeführt wird. Dies wiederum ist aber nur dann der Fall, wenn die Festplatte beim ersten Plattenzugriff noch nicht betriebsbereit ist. Bei den neuen TOS-Versionen mit Warteschleife für die Festplatte sollte man die Leertaste also vorzeitig betätigen und so das Booten von Platte verhindern. Was aber, wenn die Platte sofort bereit ist und somit keine Möglichkeit besteht, den Boot-Prozeß zu verhindern? Hier hilft wohl nur ein kurzzeitiges Abklemmen der Platte von der Stromversorgung und die Hoffnung, daß sich Atari in kommenden Systemversionen etwas Neues einfallen läßt.

Die Boot-Präferenz

Wie bereits angedeutet, wird im Verlauf des Boot-Vorgangs stets der erste ausführbare Boot-Sektor angesprungen. Hat man mehr als ein Betriebssystem auf der gleichen Platte installiert, können mehrere bootfähige Partitionen vorliegen. Es wird also ein Mechanismus benötigt, der das Booten von einer anderen Partition als der ersten ermöglicht.

In der Tat hat Atari sich hier etwas einfallen lassen. Das nicht flüchtige RAM (NVM) der Echzeituhr des TT enthält im ersten Wort eine Maske, mit deren Hilfe das Root-Programm die Boot-Partition bestimmt. Zur Zeit sind drei Werte vorgesehen:

$0000 keine Präferenz
$0040 UNIX wird gebootet (Bit 6)
$0080 TOS wird gebootet (Bit 7)

Wie man sieht, korrespondieren die Werte mit den Bit-Vektoren der einzelnen Partitionen. Mit Hilfe des SETBOOT-Programms lassen sich die drei möglichen Präferenzen einstellen. Wurde keine Präferenz vorgegeben, wird vom ersten ausführbaren Boot-Sektor gebootet, egal, um welches Betriebssystem es sich handelt. In den beiden anderen Fällen wird nach einer Partition gesucht, die anhand der Partitions-Bits dem jeweiligen System zugeordnet werden kann.

Um sich den ständigen Einsatz von SETBOOT zu ersparen, läßt sich das Standard-Root-Programm derart erweitern, daß eine Beeinflussung der Boot-Präferenz per Tastendruck, beispielsweise über eine [Shift]-Taste, erfolgen kann. Dabei empfiehlt sich die Verwendung der rechten [Shift]-Taste, da die restlichen Umschalttasten während der Boot-Phase bereits für andere Funktionen benutzt werden. Die flexibelste Lösung ist es, die Boot-Präferenz auf Tastendruck umzukehren. So kann man sich mittels SETBOOT zunächst das System einstellen, mit dem überwiegend gearbeitet werden soll, beispielsweise TOS. Soll nun das alternative System gestartet werden, genügt ein Druck auf die rechte [Shift]-Taste, um die Boot-Präferenz vorübergehend umzukehren und UNIX zu aktivieren.

Ein modifiziertes Root-Programm

Die praktische Realisierung des Boot-Se-lektors ist denkbar einfach, da lediglich eine kleine Modifikation des bereits vorhandenen Root-Programms notwendig ist. Wenn das Programm ausgeführt wird, befindet sich im Datenregister D5 bereits der Inhalt der NVM-Speicherzelle, die für die Boot-Präferenz verantwortlich ist. Somit ist es lediglich unsere Aufgabe, diese Daten geeignet auszuwerten und zu manipulieren. Ist keine Präferenz eingestellt, wird der B oot-Vorgang unverändert fortgeführt. Enthält D5 jedoch einen Wert ungleich Null, läßt sich durch eine EOR-Verknüp-fung die Boot-Priorität umkehren.

Das abgedruckte Programm NE-WROOT schreibt einen neuen Root-Sektor auf die Festplatte mit der physikalischen SCSI-Adresse 0 (entspricht der Geräteadresse 8 beim TT) und macht den Root-Sektor ausführbar. Um das Programm möglichst kurz zu halten, finden keine Sicherheitsabfragen statt.

Vorsicht: NEWROOT darf nur bei Festplatten eingesetzt werden, die voll AHDI-kompatibel partitioniert wurden, bei denen sich also nur vier Partitionseinträge im Root-Sektor befinden. Sollte das bisherige Root-Programm Ihrer Platte nicht voll AHDI-kompatibel gewesen sein, was sich darin äußert, daß nach dem Einsatz von NEWROOT nicht mehr von der Platte gebootet werden kann, so müssen Sie auf NEWROOT verzichten. Installieren Sie in diesem Fall Ihren bisherigen Plattentreiber neu oder weichen Sie auf einen Treiber aus, der mit einem Atari-konformen Root-Programm zurechtkommt. Keine Schwierigkeiten mit dem von NEWROOT installierten Root-Programm gibt es bei AHDI 4.0, AHDI 5.0, CBHD sowie HDDRIVER. Bei Verwendung des HUSHI-Treibers kann NEWROOT nicht eingesetzt werden.

US


********************************
* NEWROOT                      *
*                              *
* Boot-Selektor im Root-Sektor *
* fuer TOS/UNIX                *
*                              *
* April 1992 by Uwe Seimet     *
* (c) 1992 MAXON Computer      *
********************************

GEMDOS      = 1

BIOS        = 13
RWABS       = 4 
KBSHIFT     = 11

XBIOS       = 14 
DMAREAD     = 42

flock       = $43e 
_hz_200     = $4ba
_drvbits    = $4c2 
_sysbase    = $4f2

daccess     = $ffff8604 
dmodus      = $ffff8606 
dmahi       = $ffff8609 
gpip        = $fffffa01

            text

            move #10,-(sp)              ;von SCSI
                                        ;Device 0
            clr -(sp)                   ;Rootsektor
                                        ;lesen
            move #1,-(sp) 
            pea buffer
            move #10,-(sp)              ;physikalisch
            ;mit Retry
            move #RWABS,-(sp) 
            trap #BIOS 
            lea 14(sp),sp 
            tst.l d0 
            bne.s error

            lea buffer,a0               ;Start des
                                        ;Rootprogramms

            lea rootprg,a1 
            move #rootend-rootprg-1,d0 
copy:       move.b (a1)+,(a0)+          ;Rootprogram
                                        ;kopieren
            dbra d0,copy 

            clr d1
            lea buffer,a0 
            move #234,d0 
check:      add (a0)+,d1                ;Prüfsumme
                                        ;bilden
            dbra d0,check 
            move #$1234,d0 
            sub d1,d0
            move d0,(a0)                ;Prüfsummen-
                                        ;ausgleich

            move #10,-(sp)              ;auf SCSI
                                        ;Device 0
            clr -(sp)                   ;Rootsektor
                                        ;schreiben
            move #1,-(sp) 
            pea buffer
            move #11,-(sp)              ;physikalisch
                                        ;mit Retry
            move #RWABS,-(sp) 
            trap #BIOS 
            lea 14(sp),sp

error:      clr -(sp)
            trap #GEMDOS

*Es folgt das eigentliche Rootprogramm 
rootprg:
            bra.s start
            bra read                    ;Sprung auf
                                        ;Leseroutine
start:      bclr #2,_drvbits+3          ;Laufwerk C
                                        ;abmelden
            movem.l d3/d5,-(sp) 
            move #-1,-(sp) 
            move #KBSHIFT,-(sp) 
            trap #BIOS 
            addq.l #4,sp 
            btst #3,d0 
            bne.s exit
            btst #0,d0                  ;Shift-Taste
                                        ;rechts?
            beq.s noshift               ;nein-
            tst.b d5
            beq.s noshift               ;keine
                                        ;Präferenz-
            eor.b #$c0,d5               ;Maske
                                        ;wechseln

noshift:    moveq #3,d0
            moveq #$f8,d1
            lea rootprg+$1c6(pc),a0
            cmp.l #"DMAr",d3            ;DMAREAD
                                        ;vorhanden? 
            beq.s dma                   ;ja-
            moveq #-1,d4                ;Flag für
                                        ;DMAREAD
            moveq #$80,d2               ;TOS booten
            bra.s test1 
dma:        move.b d5,d2
            beq.s test2                 ;keine
                                        ;Präferenz-

*voreingestelltes System booten 
test1:      btst #0,(a0)                ;Partition
            beq.s noval1                ;ungültig-
            and.b d1,(a0) 
            cmp.b (a0),d2 
            beq.s boot 
noval1:     lea 12(a0),a0
            dbra d0,test1 
            bra.s exit

*von erstem ausführbaren Bootsektor booten 
test2:      btst #0,(a0)
            beq.s noval2 
            and.b d1,(a0) 
            bne.s boot 
noval2:     lea 12(a0),a0
            dbra d0,test2

*Rückkehr ins TOS 
exit:       addq.l #8,sp
tostest:    move.l _sysbase,a0 
            move.l $18(a0),d0 
            swap d0
            cmp.l #$19870422,d0         ;altes TOS?
            bcc.s ret                   ;nein-
            move #$e0,d7 
ret:        rts                         ;zurück ins
                                        ;System
boot:       move.l 4(a0),d6
            moveq #1,d5 
            lea rootprg+512(pc),a4 
            bsr.s read                  ;Bootsektor
                                        ;lesen
            tst d0 
            bne exit 
            move.l a4,a0 
            move.w #$ff,d1 
            moveq #0,d0 
chk:        add (a0)+,d0
            dbra d1,chk
            cmp #$1234,d0               ;Bootsektor
                                        ;ausführbar? 
            bne exit                    ;nein-
            lea read(pc),a3 
            lea tostest(pc),a5 
            movem.l (sp)+,d3/d5
            cmp.b #$e9,(a4)             ;Sektor DOS-
                                        ;kompatibel? 
            bne.s jmp                   ;nein-
            jmp 30(a4)                  ;Bootprogramm
jmp:        jmp (a4)                    ;ausführen-
read:       tst d4                      ;DMAREAD
                                        ;verfügbar? 
            bmi.s acsi                  ;nein-

*Sektor per DMAREAD lesen
            move d4,-(sp) 
            pea (a4) 
            move d5,-(sp) 
            move.l d6,-(sp) 
            move #DMAREAD,-(sp) 
            trap #XBIOS 
            lea 14(sp),sp 
            rts

*Sektor von ACSI-Bus lesen 
acsi:
            tas flock                   ;Busfreigabe
            bne acsi                    ;abwarten
            move.l _hz_200,d0 
            addq.l #2,d0 
wait:       cmp.l _hz_200,d0
            bcc wait 
            lea dmahi,a6 
            movem.l d6/a4,-(sp) 
            move.b 7(sp),4(a6) 
            move.b 6(sp),2(a6) 
            move.b 5(sp),(a6) 
            lea com(pc),a6 
            move.b 1(sp),1(a6) 
            move.b 2(sp),5(a6) 
            move.b 3(sp),9(a6) 
            move.b d5,13(a6) 
            addq.l #8,sp 
            lea dmodus,a6 
            lea daccess,a5 
            move #$198,(a6) 
            move #$98,(a6)
            move d5,(a5)                ;SektorZähler
            move #$88,(a6) 
            moveq #0,d0
            move.b d7,d0                ;Gerätenummer
            or.b #$08,d0                ;READ SECTOR
            swap d0
            move.w #$8a,d0 
            bsr.s hshake 
            lea com(pc),a0 
            moveq #3,d2 
send:       move.l (a0)+,d0
            bsr.s hshake 
            dbra d2,send 
            moveq #$0a,d0
            move.l d0,(a5)              ;Übertragung
                                        ;starten
            move.l #$190,d1 
            bsr.s wt 
            move #$8a,(a6) 
            move (a5),d0 
            and #$ff,d0 
            beq *+2 
err:        moveq #-1,d0
            move #$80,(a6) 
            clr.b flock 
ret0:       rts
com:        dc.l $8a,$8a,$8a,$1008a     ;Kommandos
                                        ;für READ
hshake:     move.l d0,(a5)
            moveq #$0a,d1 
wt:         add.l _hz_200,d1
wait0:      btst #5,gpip
            beq ret0
            cmp.l _hz_200,d1 
            bcc wait0 
            addq.l #4,sp 
            bra err
rootend:

            bss

buffer:     ds.b 512

Uwe Seimet
Aus: ST-Computer 06 / 1992, Seite 112

Links

Copyright-Bestimmungen: siehe Über diese Seite