Подтвердить что ты не робот

Какую информацию загружает BIOS в оперативную память?

Я знаю, что при загрузке BIOS загружает первый сектор (512 байт) заранее определенного диска устройства в память 0x7c00, а затем переходит к этому адресу.

Итак, занята память от 0x7c00 до 0x7dff. Есть ли другой раздел ОЗУ, который занят?

Если я программирую операционную систему, могу ли я использовать всю ОЗУ, кроме 0x7c00, для ox7dff для моих собственных целей?, или есть ли другой раздел, заполненный "драгоценной" информацией во время загрузки, который я не должен перезаписывать?

Я знаю, что в данный момент я могу перезаписать MBR, загруженный в память (chainloading), мой вопрос сосредоточен на... какая часть памяти доступна для операционной системы?

Извините за мой плохой английский. Спасибо за ваши ответы!

4b9b3361

Ответ 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.

Ответ 2

С помощью любого удаленного BIOS, вы можете получить информацию о карте памяти, используя BIOS Int 15/AX = E820h вызов. Это скажет вам, какую память вы можете использовать для своей ОС.

Более подробное объяснение того, как обнаружить доступную память, и содержимое Карта памяти BIOS можно найти на OSDev.

Ответ 3

Если вы пишете ОС, как только вы перейдете в защищенный режим, вы забудете BIOS (если вы не работаете с каким-то плохим устройством) и используйте все, что у вас есть.

Или вы пишете загрузчик?