Какую информацию BIOS загружает в RAM? - PullRequest
12 голосов
/ 27 июня 2009

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 04 сентября 2011

Карта памяти реального режима 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 МБ.

7 голосов
/ 27 июня 2009

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

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

0 голосов
/ 27 июня 2009

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

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

...