Domanda

Sto scrivendo un boot loader e ho la maggior parte dei dettagli, ma non sono sicuro del motivo per cui alcuni bootloader si trasferiscono in memoria prima di iniziare la maggior parte della loro esecuzione.

Qualcuno può spiegarlo?

Un esempio di questo comportamento è il bootloader del kernel Linux originale v0.01 che contiene il seguente commento:

  

boot.s viene caricato a 0x7c00 dalle routine di avvio del bios, e si sposta da solo per indirizzare 0x90000, e salta lì.

È stato utile?

Soluzione

Dall'articolo collegato:

  

In pratica, l'MBR di solito contiene un caricatore di avvio il cui scopo è caricare un altro caricatore di avvio, che si trova all'inizio di una delle partizioni. Questo è spesso un programma molto semplice che trova la prima partizione contrassegnata come attiva, carica il suo primo settore nella RAM e inizia la sua esecuzione. Poiché, per convenzione, il nuovo caricatore di avvio viene caricato anche per l'indirizzo 7C00h, potrebbe essere necessario spostare il vecchio caricatore in una posizione diversa o completamente prima di farlo. Inoltre, ES: SI dovrebbe contenere l'indirizzo nella RAM della tabella delle partizioni e DL il numero dell'unità di avvio. Infrangere tali convenzioni può rendere un bootloader incompatibile con altri bootloader.

Altri suggerimenti

CookieOfFortune è sostanzialmente corretto (Perché voleva spostare qualcosa nel posto in cui si trovava il bootloader iniziale), ma non era per un secondo bootloader, ma piuttosto il kernel stesso.

Dai suoi commenti:

  

Quindi carica il sistema su 0x10000,   utilizzando gli interrupt del BIOS. Successivamente   disabilita tutti gli interrupt, sposta il   sistema fino a 0x0000, passa a   modalità protetta e chiama l'inizio di   sistema. Quindi il sistema deve   Reinizializza la modalità protetta in   sono le proprie tabelle e si abilitano   si interrompe secondo necessità.

Vuole che il kernel si trovi a 0x0000 ... 0xKERNEL_SIZE-1, tuttavia il bootloader iniziale è attualmente a 0x7C00, quindi se il kernel si trovasse su ~ 32 KB sovrascriverebbe il bootloader mentre lo spostava. Il fatto che il kernel si trovi a 0x0000 spiega anche questo commento:

  

" NOTA! attualmente il sistema è al massimo   8 * 65536 byte di lunghezza. & Quot;

Se fosse più lungo di 512 KB a partire da 0, rischierebbe di colpire l'area riservata dello spazio degli indirizzi x86.

Credo che questa sezione del codice contenga il salto nel kernel

mov ax,#0x0001  | protected mode (PE) bit
lmsw    ax      | This is it!
jmpi    0,8     | jmp offset 0 of segment 8 (cs)

A volte il bootloader si trova nella ROM e ad un certo punto deve essere copiato nella RAM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top