Почему BIOS INT 0x19 загружает загрузчик на "0x7C00"?

Как известно, прерывание BIOS (INT) 0x19, которое ищет загрузочную подпись (0xAA55). Загружает и запускает наш загрузчик в 0x7C00, если он найден.

Мой вопрос: почему 0x7C00? Какова причина? Как оценить это с помощью некоторых методов?

3 ответа

Возможно, потому что MBR загружается в память (BIOS) по адресу 0x7c00, тогда int 0x19 ищет подпись сектора MBR 0xAA55 в секторе 0x7c00

около 0xAA55:

Не контрольная сумма, а скорее подпись. Это дает некоторые простые доказательства наличия некоторой MBR.

0xAA55 также является чередующимся битовым шаблоном: 1010101001010101

Его часто используют, чтобы определить, используете ли вы систему с прямым порядком байтов или обратным порядком, потому что он будет читаться как AA55 или 55AA. Я подозреваю, что это одна из причин, по которой он помещается в конец MBR.

около 0x7c00:

Посетите этот сайт (это может помочь вам найти ответ): https://www.glamenv-septzen.net/en/view/6

Это, вероятно, мертв, но я собираюсь ответить.

В начале любого загрузчика, когда вы устанавливаете начало сегмента в 0x7c00 затем регистры также переходят к этому адресу. Так что в идеале, если вы проверите некоторые онлайн-ресурсы, которые рассказывают вам, как использовать Int 0x19 Команда они помогут вам, как перейти на другой адрес.

Чтобы это исправить, в идеале вы должны сбросить стек в 0 в начале каждого перехода на новый адрес.

(Похоже, что это дублирует следующие вопросы:
какое значение имеет память в 0000:7c00 для последовательности загрузки?
Копирует ли BIOS 512-байтовый загрузчик в 0x7c00 )

Вдохновленный ответом на предыдущий , я бы процитировал два источника:

Итак, сначала ответьте на вопрос о модели 16 КБ из ответа Дэвида Брэдли:

Он должен был загрузиться на машине с 32 КБ. Для DOS 1.0 требовалось как минимум 32 КБ, поэтому нас не беспокоила попытка загрузки в 16 КБ.

Для запуска DOS 1.0 требуется не менее 32 КБ, поэтому модель 16 КБ не рассматривалась.

Далее следует ответ на вопрос «Почему 32KB-1024B?»:

Мы хотели оставить как можно больше места для загрузки ОС в пределах 32 КБ. Архитектура Intel 808x использовала первую часть диапазона памяти для программных прерываний, а область данных BIOS была после нее. Поэтому мы устанавливаем начальную загрузку по адресу 0x7C00 (32 КБ-1 КБ), чтобы оставить все пространство между ними для загрузки ОС. Загрузочный сектор был 512 байт, и когда он запустится, ему понадобится место для данных и стека, так что это остальные 512 байт. Итак, после выполнения INT 19H карта памяти выглядит так:

Нет, это дело не рассматривалось. Один из членов группы разработчиков IBM PC 5150 ROM BIOS, доктор Дэвид Брэдли, говорит:

«Дос 1.0 требовал как минимум 32 КБ, поэтому мы не беспокоились о попытке загрузки в 16 КБ».

(Примечание: для DOS 1.0 требуется минимум 16 КБ? или 32 КБ? Я не мог выяснить, что правильно. Но, по крайней мере, в ранней разработке BIOS в 1981 году предполагалось, что 32 КБ — это минимальные требования DOS.)

Команда разработчиков BIOS выбрала 0x7C00, потому что:

  1. Они хотели оставить как можно больше места для загрузки ОС в пределах 32 КБ.
  2. 8086/8088 использовали 0x0 - 0x3FF для вектора прерываний, а область данных BIOS была после него.
  3. Загрузочный сектор был 512 байт, а область стека/данных для программы загрузки требовала еще 512 байт.
  4. Итак, 0x7C00, последние 1024 байта из 32 КБ были выбраны.

После загрузки и запуска ОС загрузочный сектор никогда не используется до сброса питания. Таким образом, ОС и приложение могут свободно использовать последние 1024 байта из 32 КБ.

Я надеюсь, что этот ответ достаточно основан, чтобы быть уверенным, почему / как это произошло.

Другие вопросы по тегам