Каковы цели ARM ABI и EABI?

Чем больше я смотрю на этот PDF, тем меньше понимаю, что это значит. Также я хотел бы получить некоторые комментарии к этому другим 1 и 2.

2 ответа

Решение

ABI (Application Binary Interface) - это стандарт, который определяет соответствие между концепциями низкого уровня в языках высокого уровня и возможностями машинного кода конкретной аппаратной / операционной системы. Это включает в себя такие вещи, как:

  • как C/C++/Fortran/... типы данных размещаются в памяти (размеры данных / выравнивания)
  • как работают вызовы вложенных функций (где и как хранится информация о том, как вернуться к вызывающей функции, где передаются аргументы функций в регистрах ЦП и / или в памяти)
  • как работает запуск / инициализация программы (какой формат данных имеет "исполняемый файл", как код / ​​данные загружаются оттуда, как работают библиотеки DLL...)

Ответы на них:

  • зависящий от языка (следовательно, у вас есть C ABI, C++ ABI, Fortran ABI, Pascal ABI, ... даже спецификация Java-байт-кода, хотя и предназначенная для "виртуального" процессора вместо реального оборудования, является ABI),
  • в зависимости от операционной системы (MS Windows и Linux на одном и том же оборудовании используют разные ABI),
  • зависит от оборудования / процессора (ABI ARM и x86 различны).
  • развиваться в течение (длительного) времени (существующие ABI часто обновлялись / обновлялись, так что новые функции ЦП могли использоваться, например, например, указание того, как регистры SSE x86 должны использоваться приложениями, конечно, возможно только один раз Процессоры имели эти правила, поэтому необходимо было уточнить существующие ABI).

Без такой стандартизации (машинный) код, созданный разными компиляторами, не мог бы использовать библиотеки одного и того же типа (как бы вы узнали, каким образом код библиотеки ожидает передачи аргументов функции или структур данных?).

Каждая платформа (комбинация конкретного аппаратного обеспечения, программного обеспечения операционной системы и кода, написанного на определенных языках программирования / скомпилированного с помощью определенных компиляторов) определяет целый набор ABI для обеспечения совместимости. Терминология в этой области не ясна, иногда люди просто говорят о "ABI", иногда это называется "дополнением к платформе", или кто-то упоминает язык программирования и говорит, например, "C++ ABI". Имейте в виду, нет ни одной такой вещи.

Все документы, на которые вы ссылались в своем вопросе, являются конкретными примерами этого (ABI для языка / операционной системы / оборудования).

Даже на конкретной платформе нет необходимости иметь один и только один ABI (установленный), потому что разные такие соглашения могут иметь разные преимущества (и, следовательно, обеспечивать лучшую производительность / меньший код / ​​лучшее использование памяти / ... - в зависимости от программы) и разработчики систем обычно стараются быть гибкими / допустимыми.
Например, в 32-разрядной Microsoft Windows существует множество ABI (fastcall, stdcall, pascal, ...) для частей соглашения о вызовах функций.

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

ARM ABI следует указывать при использовании порта ядра ОС на ARM.

EABI - это когда процессор загружается для загрузки приложения без промежуточного ядра. (Что-то вроде того, что раньше было DOS ROM-BASIC, когда возникла DOS), то есть сама прошивка является автономным приложением, без монитора для конкретной платы или чего-либо еще.

Первая ссылка на подробный подраздел, связанный с вызовами процедур ARM ABI. По мере продвижения модели программистов с каждой версией процессора ARM такие темы важны и рассматриваются ABI.

Вторая ссылка касается спецификации двоичного формата для объектных файлов, сгенерированных компилятором ELF, который указывается торговой маркой поставщика ОС SCO. Возможно, SCO - это организация Santa Cruz, которая создает свои собственные разновидности Unix и Linux, однако эта история отклоняется от вопроса. Это должно вас заинтересовать, если вы собираетесь внедрить компоновщик с поддержкой ELF для ARM.

Если вы не заинтересованы непосредственно в деталях реализации цепочки инструментов сборки для ARM, EABI не должно вызывать особого беспокойства, и если вы не учитываете специфические для ОС аспекты такой цепочки инструментов, ARM ABI также не должно волновать.

ABI - это в основном то, как функции / процедуры передают информацию друг другу через регистры (скомпилированная форма), где хранится возвращаемое значение (укажите регистры). В x86 или x86-x64 он называется ABI (двоичный интерфейс приложения).

В архитектуре ARM он известен как EABI (расширенный двоичный интерфейс приложения). ABI, созданный до 2000 года, известен как OABI (старый двоичный интерфейс приложения), но теперь он устарел. В EABI информация / параметры передаются в форме целых чисел. Процессоры ARM, поддерживающие аппаратное обеспечение с плавающей запятой, передают параметры с помощью регистров с плавающей запятой, называемых EABIHF (расширенный прикладной двоичный интерфейс с плавающей запятой).

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