Что такое ABI (двоичный интерфейс приложения)? - PullRequest
18 голосов
/ 27 января 2011

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 27 января 2011

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

Это стандартный код запроса операционной системы для выполнения определенных обязанностей.

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

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

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

4 голосов
/ 10 апреля 2013

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

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

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

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

2 голосов
/ 22 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...