2009-06-27 19 views
12

Ich weiß, dass das BIOS beim Booten den ersten Sektor (512 Bytes) eines vordefinierten Laufwerks auf Speicher 0x7c00 lädt und dann zu dieser Adresse springt.Welche Informationen lädt BIOS in RAM?

So ist der Speicher von 0x7c00 bis 0x7dff belegt. Gibt es einen anderen Bereich des RAM, der belegt ist?

Wenn ich ein Betriebssystem programmiere, könnte ich den gesamten RAM außer 0x7c00 für ox7dff für meine eigenen Zwecke verwenden? Oder gibt es einen anderen Abschnitt mit "wertvollen" Informationen beim Booten, den ich nicht überschreiben darf ?

Ich weiß, dass zu einem bestimmten Zeitpunkt kann ich MBR im Arbeitsspeicher (Chainloading) überschreiben, meine Frage konzentriert sich auf ... welcher Teil des Speichers ist für ein Betriebssystem verfügbar?

Sorry für mein schlechtes Englisch. Danke für deine Antworten!!

Antwort

0

Wenn Sie ein Betriebssystem schreiben, sobald Sie in den geschützten Modus gehen, vergessen Sie das BIOS (außer Sie arbeiten mit einem schlechten Gerät) und verwenden Sie alles, was Sie haben.

Oder schreiben Sie einen Bootloader?

+0

Sie können das BIOS nicht vergessen. Es kann erforderlich sein, dass einige Speicherbereiche für MMIO-Regionen oder für die Verwendung durch SMM-Code geschützt sind. – bdonlan

+0

Es gibt viele physische Speicherbereiche, die nicht speziell für speicheradressierte Hardware verwendet werden können. – clemahieu

8

Die x86-Real-Modus-Speicherkarte ist wie folgt:

- 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 

In meiner realen Modus Programmierung ich in der Regel von 0x00007E00 Stick - 0x0009FFFF (alle davon nicht) .. Ich benutze Segment: Offset-Adressierung den verwenden Speicher .. um von einem 1 Stufe Bootloader zu einem Kernel gehen oder ein Bootloader 2. Stufe, die ich benutze:

; 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 

Wenn Sie in den geschützten Modus gehen, benötigen Sie immer noch einen Stub, wie oben gezeigt. In Something.s können Sie in Ihren geschützten Modus Routinen programmieren (GDT, A20, Videomodus einstellen, etc ..)

Um den Speicherort bei 0x7C00 (Bootloader Entry Point) zu erklären, ist 0x7C00 - 0x7DFF, wo Sie Ihren Bootloader platzieren (der bootloader.s oben). Sie platzieren es dort, weil das BIOS nach dem Ausführen seiner Routinen an diesen Ort springt. Der Bootloader muss genau 512 Byte groß sein (beachten Sie die TIMES-Anweisung). Von dort aus kann Ihr Code eine beliebige Größe haben (solange er in die Speicherkarte passt), und Sie können vollständig am Betriebssystem arbeiten.

Wenn Sie in den geschützten 32Bit-Modus gehen, können Sie ALLES über die 1MiB-Markierung verwenden.

+0

Ich habe das Datum erst bemerkt, nachdem ich es gepostet habe. Tut mir leid, dass ich es wieder zurückgebracht habe. –

+1

"- 0x00007E00 - 0x0009FFFF - Nicht verwendet" - Dies ist nicht ganz richtig. Der Bereich, der garantiert frei ist, ist 0x00007E00 - 0x0007FFFF.Oberhalb dieses Bereichs haben Sie die EBDA (normalerweise bei 0x0009FC00 - \t 0x0009FFFF, aber ich habe es bei 0x00096C00 und anderen Orten auch gesehen) und möglicherweise etwas BIOS-Code. Einige BIOS haben PXE-Boot-Code in diesem Bereich. Ein konservativer Ansatz besteht darin, alles über 0x00080000 zu vermeiden. – Timo