Подтвердить что ты не робот

Что такое ABI (Application Binary Interface)?

Вот что говорит Википедия:

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

ABI охватывают такие детали, как тип данных, размер и выравнивание; Вызов конвенции, которая аргументы функций возвращаемые значения; система номера вызовов и как приложение должны выполнять системные вызовы операционная система; и в случае полная операционная система ABI, двоичный формат объектных файлов, программа библиотеки и т.д. Полный ABI, таких как Intel Binary Compatibility Стандарт (iBCS), позволяет программе из одной операционной системы, поддерживающей что ABI запускается без изменений на любую другую такую ​​систему, предоставленную что необходимые общие библиотеки настоящего и аналогичных предпосылок выполнено.

Я предполагаю, что ABI - это соглашение или стандарт, а компиляторы/линкеры используют это соглашение для создания объектных кодов. Это правильно? Если да, кто сделал эти соглашения (компании или какая-то организация)? Каково было, когда ABI не было? Есть ли документы об этих ABI, к которым мы можем относиться?

4b9b3361

Ответ 1

Вы правильно относитесь к определению ABI, вплоть до точки. Классическим примером является интерфейс syscall в Linux (и других UNIX).

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

Как таковые, они решаются людьми, которые написали ОС, или, в случае, когда syscalls были добавлены позже, тем, кто их добавил (в тех случаях, когда ОС позволяет это). Например, интерфейс Linux syscall на x86 утверждает, что вы загружаете номер syscall в eax, с другими параметрами, помещенными в ebx, ecx и т.д., В зависимости от syscall вы (eax).

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

Возвращаясь к Linux, библиотеки GNU C содержат код для fopen (например), который в конечном итоге вызывает соответствующий syscall для выполнения задач нижнего уровня (номер syscall 5, open). Список syscalls можно найти в этом файле PDF.

Ответ 2

Спецификация является более подходящим термином, чем соглашение, поскольку соглашение является свободным термином для общепринятой практики, тогда как спецификация четко определена.

Вы правы. Спецификация производится органом стандартизации. Взгляните на спецификацию POSIX, которая поддерживается инструментами Windows и компиляторами/сборками, такими как gcc, предполагают, что ОС придерживается этого, и даже ядро ​​Linux частично (почти точно) придерживается его.

До ABI? Даже сегодня прошивка разрабатывается вручную, поскольку новые чипы поставляются для телеприставок и других устройств с встроенными системами.

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

Ответ 3

Ну, концепция ABI предположительно была разработана для поддержки бинарной совместимости вашей программы на других операционных системах и машинных архитектурах. Итак, давайте предположим, что вы написали программу для некоторых дистрибутивов операционной системы, работающих в архитектуре x86. Теперь для программиста самое главное, что эта программа, которую вы написали на вашей машине, должна быть способна работать точно так же на любом другом компьютере, работающем на той же или другой архитектуре, позволяет говорить ради обсуждения, что другая машина запущена на архитектуре i386, и именно здесь возникает концепция ABI или прикладных двоичных интерфейсов. Поскольку каждая машинная архитектура определяет свой собственный способ, в котором ядер ядра операционной системы взаимодействует с внешним миром, то есть программами пространства пользователя, следовательно, каждая архитектура определяет другой набор системных вызовов, машинных регистрах, как используются эти регистры, как программные прерывания обрабатываются ядром и так далее. ABI - это то, что обрабатывает эти вещи для вас, как компиляция, привязка, порядок байтов и т.д. Системным программистам было сложно определить единый ABI для одних и тех же операционных систем, работающих на разных архитектурах, и поэтому каждая машинная архитектура имеет свои собственные, и вам нужно скомпилировать свои программы, чтобы подтвердить формат, который есть у этих машин.