Карта памяти реального режима 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 (не все). Я использую сегментирование: смещение адресации, чтобы использовать память. Чтобы перейти от 1-этапного загрузчика к ядру или загрузчику 2-й стадии Я использую:
; 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 (точка входа в Bootloader), 0x7C00 - 0x7DFF - это место, где вы размещаете свой загрузчик (bootloader.s выше). Вы размещаете его там, потому что BIOS переходит в это место после выполнения своих процедур. Размер загрузчика должен быть ровно 512 байт (обратите внимание на директиву TIMES). Оттуда ваш код может быть любого размера (при условии, что он помещается в карту памяти), и вы сможете полностью работать в ОС.
Если вы действительно войдете в 32-битный защищенный режим, вы сможете использовать НИЧЕГО в отношении отметки 1 МБ.