2009-06-27 12 views
12

So che all'avvio il BIOS carica il primo settore (512 byte) di un'unità periferica predefinita nella memoria 0x7c00 e quindi passa a quell'indirizzo.Quali informazioni carica il BIOS nella RAM?

Quindi, la memoria da 0x7c00 a 0x7dff è occupata. C'è qualche altra sezione di RAM che è occupata?

Se sto programmando un sistema operativo, potrei usare tutta la RAM tranne 0x7c00 su ox7dff per i miei scopi ?, oppure, c'è qualche altra sezione piena di informazioni "preziose" al momento dell'avvio che non devo sovrascrivere ?

So che in un dato momento, posso sovrascrivere MBR caricato in memoria (chainloading), la mia domanda è incentrata su ... quale parte della memoria è disponibile per un sistema operativo?

Ci scusiamo per il mio pessimo inglese. Grazie per le tue risposte !!

risposta

0

Se si scrive un sistema operativo, non appena si entra in modalità protetta, si dimentica il BIOS (a meno che non si stia lavorando con qualche dispositivo non valido) e si usi tutto ciò che si possiede.

Oppure stai scrivendo un bootloader?

+0

Non si può dimenticare il BIOS. Potrebbe essere necessario disporre di alcune aree di memoria protette per le regioni MMIO o per l'utilizzo con codice SMM. – bdonlan

+0

Ci sono molte regioni di memoria fisica che non sono utilizzabili specificamente con l'hardware mappato in memoria. – clemahieu

8

La x86 in modalità reale Mappa della memoria è la seguente:

- 0x00000000 - 0x000003FF - Real Mode Interrupt Vector Table 
- 0x00000400 - 0x000004FF - BIOS Data Area 
- 0x00000500 - 0x00007BFF - Unused 
- 0x00007C00 - 0x00007DFF - Our Bootloader 
- 0x00007E00 - 0x0009FFFF - Unused 
- 0x000A0000 - 0x000BFFFF - Video RAM (VRAM) Memory 
- 0x000B0000 - 0x000B7777 - Monochrome Video Memory 
- 0x000B8000 - 0x000BFFFF - Color Video Memory 
- 0x000C0000 - 0x000C7FFF - Video ROM BIOS 
- 0x000C8000 - 0x000EFFFF - BIOS Shadow Area 
- 0x000F0000 - 0x000FFFFF - System BIOS 

Nella mia vera modalità di programmazione di solito bastone da 0x00007E00 - 0x0009FFFF (non tutto) .. io uso segmento: offset di indirizzamento di utilizzare la memoria .. per passare da un bootloader 1 stage per un kernel o un bootloader 2nd stage, io uso:

; bootloader.s 

BITS 16 
ORG 0x7C00 

    CLI 
    JMP 0xE000  ; Can also be JMP 0x7C00:200 
    HLT 

TIMES 510 - ($-$$) DB 0 
DW 0xAA55 

-

; Something.s 

BITS 16 
ORG 0x7E00  ; Can also be ORG 0x7C00:200 

; Code goes here for your purposes.. whether it be a 2nd stage 
; bootloader or your 16bit kernel.. 

CLI 
HLT 

Se stai andando in modalità protetta, avrai comunque bisogno di uno stub come mostrato sopra .. In Something.s puoi programmare nelle routine in modalità protetta (GDT, A20, Imposta modalità video, ecc.)

Per spiegare la posizione della memoria su 0x7C00 (punto di ingresso Bootloader), 0x7C00 - 0x7DFF è dove si posiziona il bootloader (il bootloader.s sopra). Lo posizionate lì perché il BIOS salta in quella posizione dopo aver eseguito le sue routine. Il bootloader deve avere esattamente 512 byte di dimensione (notare la direttiva TIMES). Da lì, il tuo codice può essere di qualsiasi dimensione (purché si inserisca nella mappa della memoria) e sarai in grado di lavorare pienamente sul sistema operativo.

Se si entra in modalità protetta da 32 bit, sarà possibile utilizzare QUALSIASI COSA il marchio 1MiB.

+0

Non ho notato la data fino a dopo aver postato .. Mi dispiace per averlo riportato. –

+1

"- 0x00007E00 - 0x0009FFFF - Non utilizzato" - Questo non è completamente vero. L'intervallo che è garantito per essere libero è 0x00007E00 - 0x0007FFFF.Sopra tale intervallo si avrà l'EBDA (di solito a 0x0009FC00 - \t 0x0009FFFF, ma l'ho visto a 0x00096C00 e anche in altri luoghi) e potenzialmente qualche codice BIOS. Alcuni BIOS hanno il codice di avvio PXE in questo intervallo. Un approccio conservativo è quello di evitare tutto sopra 0x00080000. – Timo