Аббревиатуры ABI, EABI, OABI обозначают стандарты организации программного обеспечения для различных платформ.
Примечание: под платформой понимается комбинация определенного оборудования, программного обеспечения операционной системы и кода, написанного определенным языком программирования и преобразованного в машинный код определенным компилятором.
ABI. Аббревиатура расшифровывается как Application Binary Interface. Это стандарт, который определяет взаимосвязь между низкоуровневыми концепциями выполнения кода и высокоуровневыми языками программирования, а также возможности машинного кода определенных аппаратных / операционных платформ. Сюда относятся такие вещи:
● Как типы данных языков C, C++, Fortran и т. д. лежат в памяти (размеры данных, выравнивание, endianness [7]). ● Как работают вложенные вызовы функций - где и как сохраняется информация о том, куда нужно сделать возврат в вызывающую функцию, где сохраняются передаваемые в функцию переменные (в каких регистрах CPU и/или ячейках памяти), как передаются возвращаемые из функции значения. ● Как работает первоначальная инициализация программы (код startup), какой должен быть формат исполняемого кода (executable), как и где хранится код и данные в памяти, как работает загружаемый код DLL, и т. п.
Таким образом, ABI специфичен для определенного языка (следовательно, есть C ABI, C++ ABI, Fortran ABI, Pascal ABI, ..., даже спецификация байт-кода Java, хотя и нацелена на некий "виртуальный" процессор вместо реального, это тоже ABI), а также для определенной операционной системы (MS Windows и Linux на одном и том же оборудовании используют разный ABI) и аппаратных особенностей CPU (API для процессоров ARM и x86 отличаются друг от друга).
Интерфейсы API развивались и обновлялись в течение длительного времени, чтобы учесть изменения новых функций CPU (например, указания того, как должны использоваться регистры x86 SSE, должны быть сделаны после того, как эти регистры появились в CPU, что соответственно потребовало обновления ABI).
Без такой стандартизации (машинный) код, созданный разными компиляторами, не смог бы использовать один и тот же тип библиотек (нельзя было бы заранее знать, как код функций библиотеки ожидает передачи аргументов, как возвращает значения, или как размещены в памяти данные структур).
Каждая платформа (см. примечание выше) определяет целый набор таких ABI, чтобы обеспечить какой-то уровень совместимости. Терминология этих понятий не очень четкая, иногда люди говорят просто об "ABI", в другой раз это называется "поддержкой платформы", или имеют в виду особенность реализации языка, например говорят "C++ ABI". Имейте в виду, что все это не одно и то же.
Даже на определенной платформе нет необходимости использовать только один ABI, потому что различные способы организации среды выполнения могут иметь разные свойства и некоторые преимущества для определенных областей использования (при определенных условиях давать лучшее быстродействие, или более эффективное использование памяти better memory usage, или что-то еще - в зависимости от программы), и разработчики системы стараются сделать её достаточно гибкой и управляемой.
На 32-битной Microsoft Windows, наример, существует множество ABI (fastcall, stdcall, pascal, ...) для соглашений о вызовах функций.
EABI. Аббревиатура означает Embedded Application Binary Interface, т. е. это то же самое, что и ABI, но для встраиваемых приложений (т. е. для программ микроконтроллеров).
Стандарт EABI определяет соглашения для форматов файлов, типов данных, использованию регистров, организацию области стека, передачу параметров в функцию как для одиночной программы встраиваемой системы (bare-metal software или firmware), так и для встраиваемой операционной системы (Embedded OS, чаще всего это RTOS).
Компиляторы, которые поддерживают EABI, создают объектный код, который совместим с кодом, создаваемым другими подобными компиляторами, позволяя разработчикам линковать в свой код библиотеки, сгенерированные другим компилятором. Разработчики, которые пишут на своем языке ассемблера, могут также использовать двоичный код, сгенерированный совместимым компилятором.
EABI был разработан для оптимизации производительности в условиях ограниченных ресурсов, которыми обладает встраиваемая (embedded) система. Таким образом, спецификации EABI опускают многие абстракции, которые реализованы для взаимодействия между ядром и кодом пользователя в сложных операционных системах. Например, динамическая линковка (загружаемые библиотеки DLL) может не поддерживаться, чтобы уменьшить объем двоичного кода и ускорить его загрузку и выполнение. Также может использоваться фиксированное назначение регистрам определенных функций, что позволяет более экономно использовать стек и ускорить вызовы функций и обработчиков прерываний. Также часто для ускорения работы дозволяется работа приложения пользователя в привилегированном режиме процессора, что дает полный контроль приложению над аппаратными ресурсами MCU без необходимости вызова промежуточного драйвера операционной системы.
Часто используемые EABI включают PowerPC [3], Arm EABI [4] и MIPS EABI [5]. Специфические программные реализации наподобие библиотек языка C могут накладывать дополнительные ограничения для формирования более конкретного ABI; один из примеров это GNU OABI [6] и EABI for ARM, оба они являются подмножествами ARM EABI.
[Ссылки]
1. What are the purposes of the ARM ABI and EABI? site:stackoverflow.com. 2. Application binary interface site:wikipedia.org. 3. "EABI Summary". PowerPC Embedded Application Binary Interface: 32-Bit Implementation (PDF) (Version 1.0 ed.). Freescale Semiconductor, Inc. 1 October 1995. pp. 28–30. 4. ABI for the Arm Architecture site:developer.arm.com. 5. MIPS EABI documentation site:sourceware.org. 6. ArmPorts site:wiki.debian.org. 7. Порядок следования байт (endianness). |