SUCKUP.de

Der Bootvorgang – Wie fährt ein PC hoch…

This blog post has been published on 2011-01-25 and may be out of date.

1.) Einleitung

Der Begriff „Bootvorgang“ bezeichnet das Starten des Rechners, das Auswählen eines Betriebssystems und das Starten desselben. Der Begriff „Booten“ geht auf das englische Wort „bootstrap – Stiefelanzieher“ zurück.
Der Bootvorgang wird durch Reset initiiert. Reset tritt Beispielsweise auf, wenn der Strom eingeschaltet wird, die damit zusammenhängenden Vorgänge werden in Kapitel 2 beschrieben. Im Laufe des Bootvorganges gibt es später drei verschiedene Möglichkeiten, das Betriebssystem zu finden und zu laden – abhängig davon, wo sich der Code des Betriebssystems befindet:
1.) Der Code befindet sich auf einer Diskette, auf die direkt zugegriffen werden kann.
2.) Der Code befindet sich auf einer Festplatte.
Und das darauf folgende starten des Betriebssystems.


2.) Start

2.1) Reset
Beim Einschalten des Stromes wird „Reset“ ausgelöst, dabei handelt es sich um einen Hardwareinterrupt. Interrupts treten dann auf, wenn ein korrekter Programmablauf nicht mehr möglich oder wünschenswert ist. Alle Interrupts haben eine Priorität. Treten also mehrere Interrupts gleichzeitig auf, so werden sie nach Priorität geordnet ausgeführt, es sei denn, der Interrupt mit der höheren Priorität stoppt die weitere Programmausführung.
„Reset“ ist der Interrupt mit der höchsten Priorität: Er wird in jedem Fall ausgeführt. Das Reset Signal kann auch ausgelöst werden, ohne dass die Stromzufuhr unterbrochen wird. Dieser Fall wird als Warmstart bezeichnet. Den durch den Beginn der Stromzufuhr initiierten Start nennt man Kaltstart.


2.2) ROM
ROM (Read Only Memory) dabei handelt es sich um einen Speicherbaustein, aus dem nur Daten gelesen, in den aber keine Daten geschrieben werden können. Die gespeicherten Daten werden
bereits bei der Produktion der Bausteine festgelegt und können im Nachhinein nicht mehr oder nur mit speziellen Geräten verändert werden. Das ROM verliert seine Daten nicht, wenn keine Stromzufuhr angeschlossen ist. Sobald Reset gegeben wurde, wird die Hardwareinterrupt gestartet, wodurch prozessorinterne Register auf prozessorspezifische Startwerte gesetzt werden und versetzt so den gesamten Prozessor in den Startzustand. In der Regel wird anschließend der Inhalt des ROM in den RAM (Arbeitsspeicher) gespiegelt, da der Zugriff auf Speicherinhalte dort schneller gewährt werden kann. Zuletzt wird der Befehlszähler (Program Counter) auf den Beginn dieses Codes gesetzt, dadurch wird gewährleistet, dass der im ROM befindliche Code als erstes und ohne Voreinstellungen ausgeführt wird.


2.3) BIOS
Im ROM steht der Code des Basic Input Output Systems (BIOS). Dies ist ein Programm, das die Hardware überprüft und einfachste Hardwareunterstützung zur Verfügung stellt. Außerdem hat das BIOS die Aufgabe, den Start eines Betriebssystems zu ermöglichen und zu initiieren. Das BIOS führt nach seinem Start zunächst Hardwaretests durch, diese Tests werden „Power On Self Tests“ (POST) genannt. Während dieser Tests wird nach Hardware gesucht und gefundene Hardware überprüft, außerdem sucht das BIOS nach passenden Treibern. Zudem können durch diese Tests Fehler (z.B. defekte Festplatte) schneller erkannt werden.


Der POST lässt sich in einzelne Schritte einteilen. Die folgenden Schritte sind Teil jedes POST:
1. Überprüfung der Funktionsfähigkeit der CPU (bei Multiprozessor-Systemen: der ersten CPU)
2. Überprüfung der CPU-nahen Bausteine
3. Überprüfung des CMOS-RAM (Prüfsummen-Bildung)
4. Überprüfung des CPU-nahen Cache-Speichers
5. Überprüfung der ersten 64 Kilobyte des Arbeitsspeichers
6. Überprüfung des Grafik-Speichers und der Grafik-Ausgabe-Hardware


Danach kann die Grafik in Betrieb genommen werden. Die weiteren Tests werden daher meist auf dem Bildschirm sichtbar gemacht:
– Überprüfung des restlichen Arbeitsspeichers – dieser Schritt kann bei manchen BIOS durch einen Tastendruck übersprungen werden
– Überprüfung der Tastatur
– Überprüfung von weiterer Peripherie, u.a. Diskettenlaufwerke und Festplatten.
Anschließend lädt das BIOS veränderbare Daten z.B. Datum und Uhrzeit in einen Speicher. Diese Daten befinden sich auf einem kleinen Speicherbaustein, der durch eine Batterie konstant mit Strom versorgt wird. So können auch während eines Spannungsabfalls im restlichen System keine Daten verloren gehen. In diesem Speicher sind auch die benutzerdefinierten BIOS-Optionen gespeichert. Während des Startvorgangs kann der Benutzer in das Konfigurationsmenü gelangen, so dass man diese Dateien teilweise selber anpassen kann. Zuletzt sucht das BIOS nach einem bootfähigen Speichermedium. Ein Speichermedium kann zum Beispiel eine Festplatte, eine USB-Stick oder eine Diskette sein.


Jede Diskette ist in mehrere Sektoren unterteilt, von denen jeder einzelne 512 Byte umfasst. Eine Diskette wird genau dann als bootfähig bezeichnet, wenn…
1.) …von ihr ein vollständiges Betriebssystem geladen werden kann.
2.) …durch den auf ihr gespeicherten Code ein Betriebssystem von einer anderen Quelle geladen werden kann.
Den ersten Sektor einer bootfähigen Diskette nennt man Bootsektor.
Bei der Suche nach bootfähigen Speichermedien geht das BIOS nach einer Reihenfolge vor, die in BIOS festgelegt werden kann.


3.) Speichermedien

3.1) Booten von Diskette
Disketten sind nur in Sektoren aufgeteilt (im Gegensatz zu Festplatten). Der erste Sektor einer bootfähigen Diskette ist der Bootsektor, er ist 512 Byte lang und endet mit den 2 Byte der Magic Number. In den übrigen 510 Byte des Bootsektors befindet sich nun ein Programm, das den Start des Betriebssystems initiiert. Das eigentliche Betriebssystem befindet sich in den restlichen Sektoren der Diskette.
Das BIOS lädt (wenn die Magic Number stimmt) die ersten 510 Byte der Diskette in den Arbeitsspeicher und daraufhin wird dieser Code ausgeführt.


3.2) Booten von Festplatten
Die Grundstruktur aller Festplatten ist gleich: Metallscheiben mit magnetisierbarer Oberfläche rotieren mit hoher Geschwindigkeit in einem hermetisch abgeschlossen Gehäuse. Die Bits sind als Wechsel in der Magnetisierung der Scheibenoberfläche gespeichert. Schreib-/Leseköpfe (Engl. Heads) bewegen sich dicht über der Oberfläche nach innen und außen. Die Daten sind auf kreisförmigen Spuren abgelegt, die man auch als Tracks bezeichnet. Diese Anordnung unterscheidet sich grundlegend von der bei Schallplatten und CDs verwendeten: Hier gibt es pro Seite nur eine lange Aufzeichnungsspur in Form einer Spirale. Jede Spur einer Festplatte ist wiederum in einzelne Abschnitte aufgeteilt, den Sektoren (Engl. Sectors). Jeder Sektor fasst 512 Byte. Die Ansteuerung eines Sektors erfolgt über die Elektronik der Festplatte, der steuernde PC hat mit der Aufteilung in Sektoren nichts zu tun. Die meisten Festplatten benutzen die Ober- und Unterseite der Scheiben und verfügen über mehrere Magnetscheiben. Die Schreib-/Leseköpfe für alle Oberflächen sind als Einheit montiert, sie können sich nicht unabhängig bewegen. Deshalb liegen die Spuren auf den Plattenoberflächen exakt übereinander. Ein Satz von übereinander liegenden Spuren trägt den Namen Zylinder (Engl. Cylinder). Wie bereits erwähnt sind Festplatten in Abschnitte unterteilt, die mit den Koordinaten [cylinder, head, sector] angesprochen werden können. Zusätzlich kann eine Festplatte in Partitionen unterteilt werden.
Die im BIOS enthaltenen Treiber sind jedoch sehr stark minimiert, daher kann das BIOS nur auf begrenzten Festplattenplatz zugreifen. Die BIOS-Treiber können nur die Zylinder 0 bis 1023 der Festplatte ansprechen (8-GByte), auslesen und erkennen nicht mehr als zwei Partitionen, auf jeder der Partitionen kann ein Betriebssystem installiert werden. Die folgenden Ausführungen gelten nur für IDE-Festplatten, bei SCSI-Festplatten mit ihrem eigenen BIOS gibt es derlei Probleme nicht. Partitionen, von denen ein Betriebssystem geladen werden kann, heißen bootfähige oder aktive Partitionen.


CHS-Modus:
Bis etwa 1997 wurde für die Adressierung der Festplatte das CylinderHeadSector-Verfahren genutzt. Dadurch kann jeder 512 Byte Sektor durch die Angabe des Zylinder, des Kopfes und des Sektors genau lokalisiert werden. Die Köpfe geben dabei die Magnetscheibe und deren Seite an und die Zählung wird wie bei den Zylindern mit 0 angefangen.


CHS


(Zylinder) x  (Lese-Schreibköpfe) x (Sektoren) x (Sektoren Größe)
1024 x 255 x 63 x 512 Byte
= 8.422.686.720 Byte = 8.225.280 kByte = 8.032,5 MByte = 7,8 GByte


LBA-Modus:
Da heutige Festplatten wesentlich größere Kapazitäten haben, verwendet man zur Adressierung die “Linear Block Address”. Diese Adresse ist vier Byte (32Bit) lang und numeriert alle Sektoren einer Festplatte der Reihe nach durch. Dadurch ergibt sich eine maximale Gesamtkapazität von:
(Sektoren) x (Sektoren Größe)
2^32 x 512 Byte
= 2048 GByte = 2 TeraByte


Für die Verwaltung der Partitionen liegt in dem äußersten Zylinder jeder Festplatte der Master Boot Record (MBR). Der Master Boot Record enthält alle Informationen, die für den Bootvorgang benötigt werden. Er ersetzt in den nun folgenden Vorgängen das BIOS. Beim Booten von einer Festplatte wird das BIOS nicht mehr benötigt, sobald der im MBR enthaltene Code
gestartet wurde.


Jede Partition funktioniert ähnlich wie eine Diskette: sie beginnt mit einem Bootsektor, in dem sich ein Programm befindet, das vom MBR gestartet wird. Die sogenannte Master-Boot-Routine wird nun durchlaufen, Standardmäßig prüft dieser Code zunächst die Einträge in der Partitionstabelle und sucht eine primäre Partition, die als aktiv (bootfähig) markiert ist. Dann lädt der Master-Boot-Code den physikalisch ersten Sektor der aktiven Partition, den Bootsektor.


Der Master Boot Record
Der MBR enthält von Fabrik aus einen Code, der das weitere Hochfahren steuert. Dieser Code wird Master Boot Code (MBC) genannt. Mit dem MBC kann von Festplatte gebootet werden, wenn nur eine aktive Partition existiert. Außerdem enthält der MBR eine Datei, in der alle Partitionen verzeichnet sind – diese wird Partitionstabelle genannt. Der MBR befindet sich übrigens im ersten Sektor der Festplatte, da ein Sektor jedoch nur 512 Bytes aufweist, müssen sich Bootcode und Partitionstabelle diesen Platz teilen: In den ersten 446 Bytes wird der Programmcode des Bootloaders ausgelagert, und in den nächsten 64 Bytes wird die  Partitionstabelle untergebracht. Die letzten zwei Bytes enthalten den Code AA55h, der zur Identifizierung des MBRs selber dient.
Die Partitionstabelle enthält je Partition: (16 Byte lange Einträge)
– Boot-Flag (1 Byte) – Markiert die Partition als aktiv. Das könnte man auch mit einem Bit ausdrücken, in der Tabelle wird dennoch ein Byte freigehalten.
– Kopfnummer des Partitionsbeginns (1 Byte)
– Sektor und Zylindernummer des Boot-Sektors (2 Byte)
– Systemcode (1 Byte) – Bezeichnet den Typ der Partitionen: NTFS, unformatiert…
– Kopfnummer des Partitionsendes (1 Byte)
– Sektor und Zylindernummer des letzten Sektors der Partition (2 Byte)
– relative Sektornummer des Startsektors (4 Byte)
– Anzahl der Sektoren in der Partition (4 Byte) – Der MBC lädt die Partitionstabelle und wählt den aktiven Sektor aus. Anschließend lädt er den Inhalt des Bootsektors der ausgewählten Partition. Der dort gespeicherte Code wird gestartet und somit der Start des Betriebssystems initiiert.


Der Bootsektor
Innerhalb einer Partition gibt es einen weiteren Sektor, dessen Position immer gleich ist: der Bootsektor. Er liegt im ersten Sektor der Partition und ist damit leicht über die Einträge in der Partitionstabelle zu ermitteln.


Multiboot
Wenn die Festplatte mehrere verschiedene Betriebssysteme auf mehreren aktiven Partitionen enthält, ist der Master Boot Code (MBC) überfordert. In diesem Fall wird ein Bootmanager benötigt. Ein Bootmanager ist eine erweiterte Version des MBC. Er liest die Partitionstabelle ein und gibt über den Bildschirm eine Liste der als aktiv markierten Partitionen aus. Der Benutzer wählt eine dieser Partitionen aus. Der Bootmanager lädt den Bootsektor der ausgewählten Partition und startet den dort gespeicherten Code. Moderne Bootmanager enthalten eigene Treiber. Dadurch sind sie nicht auf die eingeschränkten BIOS Treiber angewiesen und können zum Beispiel auch Betriebssysteme starten, die sich auf der dritten oder vierten Partition befinden. Die 446 Bytes vom MBR welche für den Bootloader reserviert sind, reichen definitiv nicht aus, um eine vernünftigen Bootloader darin unterzubringen. Daher dient dieser Code in der Regel nur dazu, einen zweiten Code zu laden, der sich auf einer der Partitionen befindet. Diesen zweiten Bootloader bezeichnet man als Secondary Bootloader. Typische Bootloader für Linux-Systeme sind LILO und Grub.


Beispiel für einen Bootmanager: GRUB
GRUB (ein Akronym für GRand Unified Bootloader (engl. “Großer vereinheitlichter Bootloader”)) – GRUB ist der Linux Standard, dessen wichtigste Vorteil dieses Bootmanagers ist seine Flexibilität, verwendet, wie auch andere moderne Bootmanager, eigene Treiber, um nicht auf die Hardwareunterstützung durch das BIOS angewiesen zu sein. Dadurch sind nicht nur die BIOS Beschränkungen außer Kraft gesetzt. GRUB kann mit den eigenen Treibern die kernelspezifischen Formate des zu bootenden Betriebssystems verwenden. So können sehr viele Systeme geladen werden, auch ohne dass die physikalischen Adressen des Codes bekannt sind. Dadurch wird andererseits das Programm sehr groß und der Code passt nicht mehr im Ganzen in den MBR. Deshalb wurde GRUB in zwei Teile unterteilt ist:
GRUB Stages 1 & 2.
GRUB Stage 1 – hat dabei hauptsächlich die Aufgabe, Stage 2 zu laden und auszuführen.
GRUB Stage 2 – befindet sich auf der Festplatte. Da das Programm meist Teil einer Linux Distribution ist, befindet sich Stage 2 in der Regel auf der entsprechenden Linux Partition.
Bootvorgang_Linux
Beim Chainloading spricht GRUB die einzelnen Bootloader oder Bootsektoren der Betriebssysteme an und übergibt ihnen den Systemstart.
title=Windows Vista
      rootnoverify (hd?,?)
      chainloader +1
      makeactive


Beispiel für einen Bootmanager: Vista
Für ältere Betriebssysteme greift der Windows Boot Manager auf die als Windows Legacy OS Loader gekennzeichneten Objekte zurück, hierbei handelt es sich im Grunde um den Verweis auf einen weiteren Bootsektor. An diesen Boot-Loader wird dann die Kontrolle des weiteren Startvorgangs übergeben. Windows 2000/XP/2003 werden so beispielsweise gestartet.
Und hier kommt dann wieder die altbekannte boot.ini ins Spiel. Denn für den Start der alten Windows-Versionen wird einfach der ntldr aktiviert, der wiederum die boot.ini ausliest.
Die bisher in der boot.ini abgelegten Informationen finden sich nun im so genannten Boot Configuration Data Store (BCD). Diese Binärdatei ist meist im Verzeichnis \boot der Startpartition. Änderungen an der Boot-Konfiguration lassen sich nur noch über das Kommandozeilen-Tool (als Administrator) bcdedit.exe durchführen.
Bevor wir nun irgendwelche Änderungen an der BCD vornehmen, sollte mittels bcdedit
/export sicherung – ein Backup angelegt werden und bei Bedarf mittels bcdedit
/import sicherung – diese wieder einspielen.


Code:
bcdedit /create {legacy} /d “Windows XP”
bcdedit /set {legacy} device partition=D:
bcdedit /set {legacy} osdevice partition=D:
bcdedit /set {legacy} path \ntldr
bcdedit /displayorder {legacy} /addlast


Linux als Boot-Option:
Will man zusätzlich Linux installieren und trotzdem dem Windows Boot-Manager verwenden (Tipp: es ist ggf. leichter dies mit GRUB zu realisieren, wie bereits zuvor gezeigt wurde) ist das auch nicht allzu schwer. Man sollte jedoch bei der Installation von Linux lediglich darauf achten, dass der Bootloader von Linux nicht in den MBR geschrieben wird sondern in die Linux-Partition.


Code:
dd if=/dev/xxx of=/bootloader.bin bs=512 count=1
Ersetze das xxx durch das Device, auf dem Linux installiert ist, also beispielsweise sda1. Die Datei bootloader.bin kopierst du z.B. auf einen USB-Stick. Das direkte Mounten und Beschreiben der NTFS-Partition von Vista ist nicht unbedingt empfehlenswert. Starte nun Windows und kopieren die bootloader.bin auf die Windows-Partition. Mit den folgenden Befehlen erzeugst du den Boot-Eintrag:


Code:
bcdedit /create /d “Linux starten” /application bootsector
Du bekommst jetzt die neue GUID angezeigt, die du für die folgenden Befehle verwenden können.


Code:
bcdedit /set {neueGUID} device boot
bcdedit /set {neueGUID} path \bootloader.bin
bcdedit /displayorder {neueGUID} /addlast


4.) Der Betriebssystemstart

4.1) Der Bootstrap Loader
In diesem Kapitel wird das Programm beschrieben, das sich im Bootsektor eines bootfähigen Speichermediums befindet. Dieses Programm heißt Bootstrap Loader oder abgekürzt Bootloader. Es ist ein Teil des zu ladenden Betriebssystems; die folgenden Vorgänge sind also Betriebssystem-spezifisch. Die Aufgabe des Bootloaders besteht darin,die einzelnen Bestandteile des Betriebssystemkerns (Kernel) in vorherbestimmte Positionen im Arbeitsspeicher zu laden und ihren Start zu initiieren. Außerdem stellt er eine primitive Laufzeit-Umgebung bereit, so dass der Kernel, falls nötig, kompiliert werden kann. Der Bootloader ist meistens zu groß, um komplett in den ersten 510 Byte der Diskette/ Partition gespeichert werden zu können. Daher sind viele Bootloader in zwei Teile unterteilt, von denen einer im Bootblock und der andere auf dem Rest der Festplatte (oder Diskette) gespeichert ist. Hierbei übernimmt der zweite und größere Teil die Aufgabe des Bootloaders, während der erste Teil den zweiten Teil lädt. Besonders typisch ist diese Vorgehensweise für das Betriebssystem DOS. Bei DOS werden die beiden Teile des Bootloaders als Bootblock 1 und Bootblock 2 bezeichnet.


4.2) Bootstrap
Als Bootstrap (zu Deutsch Schnürsenkel) wird das Starten des Betriebssystems bezeichnet. Der Bootstrap Loader ist nach diesem Vorgang benannt worden, da er den Bootstrap initiiert. Der Bootstrap beginnt mit dem Start des Bootstrap Loaders und endet mit dem Start des ersten User Programms.