Некоторые подробности процесса загрузки ОС на 32-разрядных компьютерах x86 - PullRequest
0 голосов
/ 01 января 2019

Я пытаюсь написать ОС для собственного использования, я хочу показать пустой (черный) экран с выходом VGA, но у меня есть некоторые проблемы (вопросы):

  1. Под FAT32 у меня есть загрузчик MBR для чтения первого сектора образа виртуального диска, сгенерированного bximage из Bochs.Куда (какой сектор) я должен поместить второй скомпилированный код, который показывает черный экран?Как это сделать с помощью утилиты dd?Мой второй файл скомпилированного кода - только 9 байт.

  2. Нужен ли VBR?

  3. Как узнать, где начинается область данных (FAT32)и заканчивается?

Я переписал загрузчик, предоставленный по этой ссылке .

Технические характеристики моего файла диска: 20M, CHS 40/16/63

1 Ответ

0 голосов
/ 01 января 2019

В хронологическом порядке ...

Изначально не было жестких дисков и (если вы не использовали "BASIC in ROM") компьютеры, загружаемые с дискеты.В этом случае первый сектор тома (дискета) содержит загрузчик операционной системы.

Вскоре после добавления жестких дисков и работает по аналогичной схеме (где первый сектор тома /жесткий диск содержит загрузчик операционной системы).

Однако вскоре люди поняли, что использование целого «большого» жесткого диска для одного тома глупо / негибко;поэтому была изобретена схема разбиения для разделения жесткого диска на несколько томов.В этом случае первый сектор диска (MBR) содержит таблицу разделов, где один отмечен как «активный» раздел, и некоторый код для «цепной загрузки» первого сектора активного раздела (загрузчик).Это стало «чрезвычайно стандартным», тогда люди расширили его для поддержки нескольких разных операционных систем, и большинство менеджеров загрузки поддерживают несколько операционных систем, используя этот метод.

Примечание 1. Я определяю «менеджер загрузки» как нечтоВы используете, чтобы выбрать, какую ОС загружать, и «загрузчик» как нечто, предназначенное для загрузки конкретной ОС, которая была выбрана.В идеале они не имеют ничего общего друг с другом, менеджер загрузки не должен иметь ничего общего с любой ОС, и конечный пользователь должен иметь возможность менять менеджер загрузки на что угодно, не нарушая и не воздействуя на любую ОС или любой загрузчик.К сожалению, (для Windows) Microsoft враждебно настроена на то, чтобы позволить нескольким различным операционным системам загружаться, используя простые, разумные и хорошо поддерживаемые методы (включая возможность одновременной установки нескольких экземпляров одной и той же версии Windows, что может быть полезно - например,одна ОС для вашей работы и отдельная ОС для ваших детей, которые установлены на одном компьютере) и пытаются задушить их собственным идиотизмом «boot.ini», который в основном просто делает все ужасным без пользы (кроме предоставления Майкрософт большего контроля)над тем, что вы делаете с вашим компьютером).Конечно, когда пользователь устанавливает только одну ОС на компьютере, для установщика ОС было бы неплохо (опционально, если и только если пользователь этого захочет - например, потому что у него еще нет собственного менеджера загрузки) предоставить и установить минимальныйMBR, которая не более чем цепная загрузка загрузчика операционной системы.

Со временем добавилось больше устройств.Первым были сетевые карты и возможность загрузки из сети.Это не что иное, как «загрузка с диска».Вместо этого, ПЗУ сетевой карты (после некоторого согласования с сервером DHCP) загружает весь «загрузочный файл» (который не ограничивается 1 сектором и может быть 500 КБ, если хотите) с сервера, а затем предоставляет API (который стализвестный как «PXE API»), который загрузчик может использовать для доступа к сети (например, отправлять / получать пакеты, загружать больше файлов с использованием протокола TFTP и т. д.).

Был добавлен другой тип устройства, который был добавленCD-ROM.Для них была создана новая спецификация («спецификация загрузочного компакт-диска El Torito»), частично для того, чтобы вы могли иметь загрузочный каталог с несколькими записями для нескольких архитектур (например, один для «80x86 ПК», один для «PowerPC»,и т.д.) и пусть прошивка выберет наиболее подходящий загрузчик для загружаемого компьютера.Для этого есть 3 метода для ПК - эмуляция дискеты, эмуляция жесткого диска или «без эмуляции».Параметры эмуляции работают так же, как и оригинальный метод «загрузки с диска» (и используют 512-байтовые сектора и т. Д.), Но они ограничены и медленны, и, вероятно, их не следует использовать ни для чего, кроме совместимости с устаревшими операционными системами.Для режима «без эмуляции» он полностью отличается от оригинального метода «загрузки с диска», микропрограмма должна загружать весь «загрузочный файл» (который не ограничен 1 сектором и может быть 500 КБ, если хотите), а сектора будутбыть 2048 байтов (а не 512 байтов).

Даже позже;UEFI изобрели.Для компьютеров 80x86 это бывает в двух вариантах - 32-битный 80x86 и 64-битный 80x86.Теоретически у вас может быть 64-битный загрузчик UEFI, который переключается в защищенный режим / 32-битный и запускает 32-битную ОС;и у вас может быть 32-битный загрузчик UEFI, который переключается в длинный / 64-битный режим и запускает 64-битную ОС.Однако 32-разрядный UEFI встречается очень редко (несколько старых Apple Mac и почти ничего), и эти компьютеры, вероятно, также будут поддерживать «BIOS-совместимую загрузку»;и по этой причине не стоит поддерживать 32-битный UEFI.Для UEFI в целом, он загружает и выполняет весь файл (с любого загрузочного устройства) и предоставляет API, который может использовать загрузчик (например, для настройки режима видео, получения карты памяти, загрузки другого файла / файлов и т. Д.).).

Примечание 2: UEFI пытается сделать так, чтобы загрузка работала одинаково, независимо от того, с какого типа устройства вы загружаетесь.На практике это работает не очень хорошо, и вам, вероятно, понадобится другой загрузчик для компакт-диска (который обращается к файлу / файлам на самом компакт-диске и не ограничивается только образом файловой системы FAT) и другой загрузчик длясеть (даже если это позволяет вам только передавать IP-адреса в ОС и избегать повторения медленного DHCP после загрузки ОС).

С UEFI была также введена новая схема разбиения (GPT или"Таблица разделов GUID").Это имеет множество преимуществ и (для новых операционных систем, устанавливаемых в качестве единственной ОС на компьютере), вероятно, следует рассматривать по умолчанию (а старые «разделы MBR», вероятно, следует считать устаревшими для совместимости только со старыми операционными системами).

В основном;для 80x86 вам, вероятно, понадобится 4 или более разных загрузчика:

  • один для BIOS и дисковых устройств без дисков (дискета)
  • один для BIOS и дисковых устройств, которые были разбитыс «разделами MBR»
  • один для BIOS и дисковых устройств, которые были разделены на «разделы GPT»
  • один для BIOS и загрузки по сети / PXE
  • один для BIOS и "без эмуляции "загрузка с CD
  • одна для 64-битного диска UEFI
  • одна для 64-битного компакт-диска UEFI
  • одна для 64-битной сети UEFI

Конечно, все эти случаи "достаточно различны", поэтому глупо пытаться использовать универсальный загрузчик, охватывающий несколько разных случаев (и в случаях, когда есть сходства, такие как ограничения "только 512 байт")настолько ограниченно, что вы будете обречены, если попытаетесь).

Я бы также «настоятельно рекомендовал» иметь некоторую абстракцию между загрузчиком и остальной частью ОС (например, «протокол загрузки», определенный дляОС, которая описывает, какзагрузчик настраивает, передает информацию в ОС и передает управление ОС);так что ни один из кода во всей ОС не должен знать или заботиться о том, какая прошивка была (если это был BIOS или UEFI или что-то еще, например, возможно kexec()).Это означает, что любой может создать больше загрузчиков (для поддержки других случаев и других устройств);и (если все соответствует спецификации вашей абстракции) вся ОС будет работать с новым загрузчиком / загрузчиками без каких-либо изменений.

В FAT32 у меня есть загрузчик MBR для чтения первого сектораобраз виртуального диска, сгенерированный bximage от Bochs.Куда (какой сектор) я должен поместить второй скомпилированный код, который показывает черный экран?Как это сделать с помощью утилиты dd?Мой второй файл скомпилированного кода - только 9 байт.

Это в основном неправильно.Для «жесткого диска BIOS» вы должны иметь MBR (который вообще не имеет ничего общего с ОС) и разделы, а загрузчик операционной системы должен начинаться с первого сектора раздела (и должен быть рассчитан на использование * 1054).* чтобы найти запись таблицы разделов, которая описывает ее раздел, и dl, чтобы определить, на каком устройстве находится раздел).

Нужен ли VBR?

В некоторых случаях (загрузка из UEFI, по сети, с CD-ROM) VBR не имеет смысла.В некоторых случаях (загрузка с жесткого диска BIOS или с USB-накопителя BIOS) это «теоретически необязательно», но крайне рекомендуется;потому что некоторые BIOS могут не распознавать его (особенно для случая флэш-памяти USB), а другие операционные системы предполагают, что диск не отформатирован (и сообщают своим пользователям, что диск должен быть инициализирован / разбит на разделы, убеждая пользователя в том, что вашОС является мусором и приводит к тому, что пользователь случайно или намеренно стирает вашу ОС с диска).

Как узнать, где начинается и заканчивается область данных (FAT32)?

для жира;В первом секторе тома / раздела есть поля в BPB («Блок параметров BIOS», который неправильно назван, так как в основном он вообще не используется BIOS), который сообщает вам, например, сколько зарезервированных секторов, сколько секторовв каждом кластере и т. д. Действительно, если вы собираетесь использовать одну из худших в мире файловых систем для неподходящих вещей (например, для основного раздела операционной системы, где крайне необходимы такие вещи, как эффективные разрешения / безопасность и отказоустойчивость), тогда выВам нужно будет изучить все о FAT32, чтобы вы могли написать код, который позволит ОС поддерживать его после загрузки.

...