Warum Bootloader im Speicher verlagern?
-
05-07-2019 - |
Frage
Ich schreibe einen Bootloader, und ich habe die meisten Details aus dem Effeff, aber ich bin mir nicht sicher, warum einige Bootloader selbst im Speicher verlagern, bevor sie den Großteil ihrer Ausführung beginnen.
Kann mir jemand erklären das?
Ein Beispiel für dieses Verhalten ist der original v0.01 Linux-Kernel-Bootloader der hat den folgenden Kommentar in ihm:
boot.s bei 0x7c00 durch die BIOS-Startroutinen geladen und bewegt sich aus dem Weg 0x90000 zu adressieren, und springt dort.
Lösung
Aus dem verlinkten Artikel:
In der Praxis enthält der MBR in der Regel einen Bootloader, deren Zweck es ist, einen anderen Bootloader zu laden - zu Beginn von einer der Partitionen gefunden werden. Dies ist oft ein sehr einfaches Programm, das die erste Partition findet Aktiv markiert, lädt seine erste Sektor in den RAM und beginnt seine Ausführung. Da vereinbarungsgemäß auch der neue Bootloader 7C00h zu adressieren geladen ist, kann der alte Lader, bevor Sie diese ganz oder teilweise selbst an einen anderen Ort verlegen müssen. Auch ES: SI wird erwartet, dass die Adresse im RAM der Partitionstabelle enthalten, und DL die Boot-Laufwerksnummer. solche Konventionen brechen kann einen Bootloader nicht kompatibel mit anderen Bootloader machen.
Andere Tipps
CookieOfFortune im wesentlichen korrekt ist (weil er etwas in den Ort, an dem der ursprünglichen Bootloader war bewegen wollte), aber es war nicht für einen zweiten Bootloader, sondern die Kernel selbst.
Von seinen Kommentaren:
Es lädt dann das System bei 0x10000, mit dem BIOS-Interrupts. Danach es deaktiviert alle Interrupts, bewegt sich der System nach unten zu 0x0000, ändert sich zu geschützter Modus und fordert den Start System. System dann muss Reinitialisieren den geschützten Modus in es ist eigene Tabellen, und aktiviert Interrupts nach Bedarf.
Er will der Kernel auf 0x0000 ... 0xKERNEL_SIZE-1, aber die anfänglichen Bootloader bei 0x7c00 ist derzeit befinden, so dass, wenn der Kernel über ~ 32 KB war, würde es die Bootloader überschreiben, da er es war bewegend. Die Tatsache, dass der Kernel auf 0x0000 befindet erklärt auch diesen Kommentar:
"ACHTUNG! Derzeit System höchstens 8 * 65536 Bytes lang. "
Wenn es mehr als 512 KB ist bei 0 beginnen, es würde die Gefahr einer Kollision mit dem reservierten Bereich des x86-Adressraumes ausgeführt werden.
Ich glaube, dieser Code-Abschnitt den eigentlichen Sprung in den Kernel enthält
mov ax,#0x0001 | protected mode (PE) bit
lmsw ax | This is it!
jmpi 0,8 | jmp offset 0 of segment 8 (cs)
Manchmal ist der Bootloader im ROM und muss irgendwann in dem RAM kopiert werden.