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