x86 リアル モードのメモリ マップは次のとおりです。
- 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
私のリアル モード プログラミングでは、通常 0x00007E00 から 0x0009FFFF に固執します (すべてではない)。メモリを使用するためにセグメント: オフセット アドレッシングを使用します。 :
; 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
プロテクト モードに移行する場合は、上記のようにスタブが必要です。Something.s では、プロテクト モード ルーチン (GDT、A20、ビデオ モードの設定など) をプログラムできます。
0x7C00 (ブートローダー エントリ ポイント) のメモリ位置について説明すると、0x7C00 - 0x7DFF はブートローダー (上記の bootloader.s) を配置する場所です。BIOS はそのルーチンを実行した後にその場所にジャンプするため、そこに配置します。ブートローダーのサイズは正確に 512 バイトでなければなりません (TIMES ディレクティブに注意してください)。そこから、コードは (メモリ マップに収まる限り) 任意のサイズにすることができ、OS で完全に作業できるようになります。
32Bit Protected Mode に入ると、1MiB マークについて何でも使用できるようになります。