Как вы уже догадались, исполняемые форматы содержат больше, чем просто машинный код. Например, они могут:
- Укажите метаданные для ОС, например, для какой архитектуры предназначен исполняемый файл. Эти метаданные содержат заголовок файла.
Укажите макет программы в памяти. В современных операционных системах большинство исполняемых файлов не загружаются в память одним блоком - они обычно имеют много отдельных областей/разделов/сегментов. Некоторые из этих сегментов будут содержать исполняемый код. Некоторые из них будут содержать неизменяемые данные, такие как текстовые строки. Некоторые из них будут обозначены как доступная для записи память для кучи программ.
Разные программы будут иметь разные требования (запросы) к размерам этих разделов. Это все указано в шапке.
Некоторые форматы также позволяют встраивать цифровую подпись, что позволяет проверить, откуда бинарный файл.
- Зачем нужна отдельная спецификация для двоичного кода - Linux использует ELF, а Windows - Portable Executable Format?
Причины в основном исторические, и ОС склонны придерживаться своего существующего «родного» (или «стандартного») формата, если нет веской причины для переключения (как это произошло, например, с формата DOS MZ на PE в NT 3.1 и с за год до ELF в Linux 1.2 и от COFF до ELF в различных Unixes за эти годы).
Следует отметить, что базовый машинный код зависит от архитектуры процессора, но в остальном (за исключением системных вызовов и связанных библиотек) в значительной степени переносим между операционными системами. Фактически, современные Windows и Linux могут запускать оба исполняемых формата: исполняемые файлы ELF будут работать в Windows через WSL, а исполняемые файлы PE будут работать в Linux через WINE.
- Можно ли создать операционную систему и программу, работающую в этой операционной системе, без этой спецификации двоичного формата?
Мы возвращаемся к основной цели этих форматов. Без метаданных, сообщающих ОС, куда загружать части программы, большинство современных исполняемых файлов не могут работать. Некоторые очень старые форматы, такие как COM, в значительной степени содержат чистый код, но не являются особенно гибкими и потеряли популярность.
На практике нет необходимости в существовании операционной системы. На аппаратном уровне, при условии существования (устаревшего) BIOS, BIOS просто начнет выполнение в определенном месте на диске (MBR), которое может быть произвольным машинным кодом, который затем вступает во владение и либо запускает ОС, либо выполняет какие-либо действия. еще это нравится. (Вы можете просмотреть сам MBR в двоичном формате, хотя он не имеет прямого отношения к исполняемому коду.) Более современный UEFI, однако, определяет более сложный исполняемый формат (PE).
- Зависит ли архитектура двоичного формата от ОС или от обоих?
Зависит от формата, правда. Некоторые форматы предполагают особую архитектуру. Другие позволяют выбрать архитектуру из списка указанных "магических чисел" в заголовке. Третьи совершенно не зависят от архитектуры (например, байт-код Java и .NET/CIL).
Точно так же формат обычно не накладывает никаких ограничений на ОС, хотя ОС будет ограничена тем, в каких форматах она может (изначально) распознавать и выполнять. Конечно, уровни совместимости поверх базовой ОС могут выполнять другие форматы (например, JVM, .NET/CLR, WSL & WINE и т.д.), Которые базовая ОС может не распознать.
- Применяется ли двоичный формат только к исполняемым файлам или к коду операционной системы?
Большая часть большинства современных операционных систем - это просто набор "обычных" исполняемых файлов. Однако некоторые части операционной системы являются "специальными" и не обязательно будут использовать тот же формат, что и остальные. Обычно это относится только к загрузчику и ядру.
Чтобы взять конкретный, очень распространенный пример, старый загрузчик BIOS не будет иметь формат ELF или PE, используемый Linux и Windows. Ядро Linux, как правило, построено в формате ELF, который может загружать загрузчик GRUB, но он может быть в другом формате, чтобы быть совместимым с используемым загрузчиком. Ядро Linux также поддерживает режим EFI Stub, который содержит минимальный заголовок PE/COFF для совместимости с прямой загрузкой UEFI.