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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top