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.
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.
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.
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.
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.
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