21
Lowlevel-Coding / Antw:Eigener Bootloader?!
« am: 08. June 2019, 23:12 »
Hallo,
der "klassische" Bootloader liegt im ersten Sektor des Bootlaufwerkes und wird von einem BIOS an die Adresse 0x7C00 geladen und dort ausgeführt (d.h. CS:IP zeigt auf die richtige Adresse, aber die genauen Werte sind nicht bekannt). Außerdem steht in DL das Bootlaufwerk (0x00 für Diskette, 0x80 für Festplatte). Dein Bootloader muss nun den Kernel auf dem Bootlaufwerk finden können, in den Speicher laden können und aufrufen können. Ich gehe mal von einer Diskette aus, da ist das alles einfacher.
Schritt 1: "Kernel finden". Entweder, du hast ein Dateisystem (z.B. FAT12) auf deiner Bootdiskette, dann muss dein Bootloader dieses Dateisystem soweit lesen können, um den Kernel zu finden. Oder du klebst den Kernel einfach hinten an den Bootsektor ran, dann weißt du, wo er anfängt. Du musst außerdem wissen, wie groß der Kernel ist.
Schritt 2: "Kernel laden". Das BIOS stellt dir den "int 13h" zur Verfügung, mit dem du Sektoren von den Laufwerken lesen kannst. Details gibt es z.B. bei RBIL. In Schritt 1 hast du rausgefunden, welche Sektoren du lesen musst, also musst du nur noch entscheiden, wo die Daten im Speicher hinsollen (unterhalb von 640 KB!) und die passende Anzahl der Sektoren lesen. Für Disketten musst du noch von LBA nach CHS umrechnen, oder du hast deine Sektoradressen direkt als CHS.
Schritt 3: "Kernel anspringen". In Schritt 2 hast du festgelegt, wo dein Kernel hingeladen wurde. Jetzt musst du noch wissen, wo der Einsprungpunkt ist (im Zweifelsfall das erste Byte, aber das hängt vom Kernel ab!), also machst du einfach einen FAR CALL an diese Adresse. Die genauen Werte für CS:IP legst du diesmal selbst fest.
Es gibt genug Bootloader, die du dir anschauen kannst. Vielleicht nicht gerade GRUB, aber der Bootcode von FreeDOS ist halbwegs gut kommentiert.
Hoffe, es nützt.
Gruß,
Svenska
der "klassische" Bootloader liegt im ersten Sektor des Bootlaufwerkes und wird von einem BIOS an die Adresse 0x7C00 geladen und dort ausgeführt (d.h. CS:IP zeigt auf die richtige Adresse, aber die genauen Werte sind nicht bekannt). Außerdem steht in DL das Bootlaufwerk (0x00 für Diskette, 0x80 für Festplatte). Dein Bootloader muss nun den Kernel auf dem Bootlaufwerk finden können, in den Speicher laden können und aufrufen können. Ich gehe mal von einer Diskette aus, da ist das alles einfacher.
Schritt 1: "Kernel finden". Entweder, du hast ein Dateisystem (z.B. FAT12) auf deiner Bootdiskette, dann muss dein Bootloader dieses Dateisystem soweit lesen können, um den Kernel zu finden. Oder du klebst den Kernel einfach hinten an den Bootsektor ran, dann weißt du, wo er anfängt. Du musst außerdem wissen, wie groß der Kernel ist.
Schritt 2: "Kernel laden". Das BIOS stellt dir den "int 13h" zur Verfügung, mit dem du Sektoren von den Laufwerken lesen kannst. Details gibt es z.B. bei RBIL. In Schritt 1 hast du rausgefunden, welche Sektoren du lesen musst, also musst du nur noch entscheiden, wo die Daten im Speicher hinsollen (unterhalb von 640 KB!) und die passende Anzahl der Sektoren lesen. Für Disketten musst du noch von LBA nach CHS umrechnen, oder du hast deine Sektoradressen direkt als CHS.
Schritt 3: "Kernel anspringen". In Schritt 2 hast du festgelegt, wo dein Kernel hingeladen wurde. Jetzt musst du noch wissen, wo der Einsprungpunkt ist (im Zweifelsfall das erste Byte, aber das hängt vom Kernel ab!), also machst du einfach einen FAR CALL an diese Adresse. Die genauen Werte für CS:IP legst du diesmal selbst fest.
Es gibt genug Bootloader, die du dir anschauen kannst. Vielleicht nicht gerade GRUB, aber der Bootcode von FreeDOS ist halbwegs gut kommentiert.
Hoffe, es nützt.
Gruß,
Svenska