Зачем нужна спецификация двоичного формата для исполняемых файлов?

467
Ravi Kumar

Я понимаю, что операционная система, такая как Linux или Windows, написана на C / C ++ и скомпилирована для конкретной архитектуры (например, AMD64) для создания машинного кода, который подходит для этой архитектуры.

Мои вопросы -

  1. Зачем нужна отдельная спецификация для двоичного кода - Linux использует ELF, а Windows - Portable Executable Format?
  2. Можно ли создать операционную систему и программу, работающую в этой операционной системе, без этой спецификации двоичного формата?
  3. Является ли двоичный формат зависимым от архитектуры, ОС или обоих?
  4. Применим ли двоичный формат только к исполняемым файлам или к коду операционной системы?
0

2 ответа на вопрос

3
xenoid

Основное использование формата - загрузка программ в память, что выполняется загрузчиком .

  1. Почему для двоичного кода нужна отдельная спецификация - Linux использует ELF, а Windows - Portable Execution Format?

Вежливый ответ: потому что ОС отличается и имеет разные требования. Ответ Unix: потому что Microsoft любит изобретать (квадратное) колесо.

  1. Можно ли создать операционную систему и программу, работающую в этой операционной системе, без этой спецификации двоичного формата?

Да, но только очень тривиальные, довольно простая ОС, которая запускает тривиальные программы, которым не нужно «перемещать» и не нужно ссылаться на какой-либо внешний код.

  1. Зависит ли архитектура двоичного формата от ОС или от обоих?

Нет, формат ELF используется во многих операционных системах и архитектурах.

  1. Применяется ли двоичный формат только к исполняемым файлам или к коду операционной системы?

В Linux загрузочное ядро ​​может не быть ELF, но модули ядра используют формат ELF.

«Ответ Unix: потому что Microsoft любит изобретать (квадратное) колесо». Забавно, что вы должны сказать, что PE (NT 3.1, 1993) старше, чем ELF (Linux, миграция ~ 1995 из a.out). В современном мире PE наиболее близок к [COFF] (https://en.wikipedia.org/wiki/COFF), который также ранее использовался Unixes. Bob 6 лет назад 1
Да и почти все перешли на ELF (кроме Windows и macOS). xenoid 6 лет назад 0
Что никоим образом не MS изобретает колесо. Решение (не) изменить на новый формат * после * релиза очень отличается от изобретения нового "просто чтобы быть другим". Pedantic? Да, возможно. Но ваш ответ там не очень объективен, в шутку или нет. Bob 6 лет назад 2
3
Bob

Как вы уже догадались, исполняемые форматы содержат больше, чем просто машинный код. Например, они могут:

  • Укажите метаданные для ОС, например, для какой архитектуры предназначен исполняемый файл. Эти метаданные содержат заголовок файла.
  • Укажите макет программы в памяти. В современных операционных системах большинство исполняемых файлов не загружаются в память одним блоком - они обычно имеют много отдельных областей / разделов / сегментов . Некоторые из этих сегментов будут содержать исполняемый код. Некоторые из них будут содержать неизменяемые данные, такие как текстовые строки. Некоторые из них будут обозначены как доступная для записи память для кучи программ.

    Разные программы будут иметь разные требования (запросы) к размерам этих разделов. Это все указано в шапке.

  • Некоторые форматы также позволяют встраивать цифровую подпись, что позволяет проверить, откуда бинарный файл.


  1. Зачем нужна отдельная спецификация для двоичного кода - 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.

  1. Можно ли создать операционную систему и программу, работающую в этой операционной системе, без этой спецификации двоичного формата?

Мы возвращаемся к основной цели этих форматов. Без метаданных, сообщающих ОС, куда загружать части программы, большинство современных исполняемых файлов не могут работать. Некоторые очень старые форматы, такие как COM, в значительной степени содержат чистый код, но не являются особенно гибкими и потеряли популярность.

На практике нет необходимости в существовании операционной системы. На аппаратном уровне, при условии существования (устаревшего) BIOS, BIOS просто начнет выполнение в определенном месте на диске (MBR), которое может быть произвольным машинным кодом, который затем вступает во владение и либо запускает ОС, либо выполняет какие-либо действия. еще это нравится. (Вы можете рассматривать MBR как двоичный формат, хотя он не имеет прямого отношения к исполняемому коду.) Однако более современный UEFI определяет более сложный исполняемый формат (PE).

  1. Зависит ли архитектура двоичного формата от ОС или от обоих?

Зависит от формата, правда. Некоторые форматы предполагают особую архитектуру. Другие позволяют выбрать архитектуру из списка указанных «магических чисел» в заголовке. Третьи совершенно не зависят от архитектуры (например, байт-код Java и .NET / CIL).

Точно так же формат, как правило, не накладывает никаких ограничений на ОС, хотя ОС будет ограничена тем, в каких форматах она может (изначально) распознавать и выполнять. Конечно, уровни совместимости поверх базовой ОС могут выполнять другие форматы (например, JVM, .NET / CLR, WSL & WINE и т. Д.), Которые базовая ОС может не распознать.

  1. Применяется ли двоичный формат только к исполняемым файлам или к коду операционной системы?

Большая часть большинства современных операционных систем - это просто набор «обычных» исполняемых файлов. Однако некоторые части операционной системы являются «специальными» и не обязательно будут использовать тот же формат, что и остальные. Обычно это относится только к загрузчику и ядру.

Чтобы взять конкретный, очень распространенный пример, старый загрузчик BIOS не будет иметь формат ELF или PE, используемый Linux и Windows. Ядро Linux, как правило, построено в формате ELF, который может загружать загрузчик GRUB, но он может быть в другом формате, чтобы быть совместимым с используемым загрузчиком. Ядро Linux также поддерживает режим EFI Stub, который содержит минимальный заголовок PE / COFF для совместимости с прямой загрузкой UEFI.

Похожие вопросы