2009-06-27 11 views
12

Wiem, że podczas rozruchu BIOS ładuje pierwszy sektor (512 bajtów) predefiniowanego napędu urządzenia do pamięci 0x7c00, a następnie przeskakuje do tego adresu.Jakie informacje ładuje BIOS do RAM?

Pamięć od 0x7c00 do 0x7dff jest zajęta. Czy jest jakaś inna sekcja RAM, która jest zajęta?

Jeśli programuję system operacyjny, czy mogę użyć całej pamięci RAM z wyjątkiem 0x7c00 do ox7dff dla własnych celów ?, lub czy istnieje inna sekcja wypełniona "cennymi" informacjami w czasie rozruchu, których nie wolno nadpisywać ?

Wiem, że w danym momencie mogę nadpisać MBR załadowany na pamięć (chainloading), moje pytanie koncentruje się na ... jaka część pamięci jest dostępna dla systemu operacyjnego?

Przepraszamy za mój zły angielski. Dzięki za twoje odpowiedzi !!

Odpowiedz

0

Jeśli napiszesz system operacyjny, jak tylko przejdziesz w tryb chroniony, zapomnisz BIOS (chyba, że ​​pracujesz z jakimś złym urządzeniem) i wykorzystasz wszystko, co masz.

Czy piszesz program ładujący?

+0

Nie można zapomnieć o systemie BIOS. Może potrzebować niektórych regionów pamięci chronionych dla regionów MMIO lub do wykorzystania przez kod SMM. – bdonlan

+0

Istnieje wiele regionów pamięci fizycznej, których nie można użyć specjalnie do sprzętu mapowanego w pamięci. – clemahieu

7

Przy każdym zdalnie uruchomionym systemie BIOS można uzyskać informacje o mapie pamięci za pomocą systemu BIOS Int 15/AX=E820h call. Dzięki temu dowiesz się, jakiej pamięci możesz użyć dla swojego systemu operacyjnego.

Bardziej szczegółowe wyjaśnienie na temat detect available memory oraz zawartość BIOS memory map można znaleźć pod adresem OSDev.

8

x86 Pamięć trybu rzeczywistego Mapa przedstawia się następująco:

- 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 

W moim programowania trybu rzeczywistego zazwyczaj trzymać z 0x00007E00 - 0x0009FFFF (nie wszystkie z nich) .. Używam Segment: offset adresowania używać pamięć .. aby przejść z bootloadera 1 Stage do jądra lub bootloadera 2nd Stage, używam:

; 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 

Jeśli przejdziesz w tryb chroniony, nadal będziesz potrzebował kodu pośredniczącego, jak pokazano powyżej. W programie Coś możesz programować w trybie chronionym (GDT, A20, Ustaw tryb wideo, itp.)

Aby wyjaśnić lokalizację pamięci w 0x7C00 (Bootloader Entry Point), 0x7C00 - 0x7DFF to miejsce, gdzie umieszczasz bootloader (powyższy bootloader.s). Umieszczasz to tam, ponieważ BIOS wykonuje skok do tego miejsca po wykonaniu jego procedur. Program ładujący musi mieć dokładnie 512 bajtów (patrz dyrektywa TIMES). Stamtąd twój kod może mieć dowolny rozmiar (o ile pasuje do mapy pamięci), i będziesz mógł pracować na OS w pełni.

Jeśli przejdziesz do trybu chronionego 32Bit, będziesz mógł użyć WSZYSTKIEGO o znaku 1MiB.

+0

Nie zauważyłem daty do momentu opublikowania. Przepraszamy za zwrócenie tej kopii. –

+1

"- 0x00007E00 - 0x0009FFFF - Nieużywany" - To nie do końca prawda. Zakres gwarantowany jako wolny to 0x00007E00 - 0x0007FFFF.Powyżej tego zakresu będziesz miał EBDA (zwykle 0x0009FC00 - \t 0x0009FFFF, ale widziałem go również w 0x00096C00 i innych miejscach) i potencjalnie jakiś kod BIOS. Niektóre BIOSy mają kod startowy PXE w tym zakresie. Konserwatywne podejście polega na uniknięciu wszystkiego powyżej 0x00080000. – Timo

Powiązane problemy