2011-01-27 2 views
18

Вот что говорит википедия:Что такое ABI (Application Binary Interface)?

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

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

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

+7

См. Http://stackoverflow.com/questions/2171177/i-never-really-understood-what-is-application-binary-interface-abi – Simone

ответ

12

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

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

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

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

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

+0

Я не думаю, что его операционная система, которая определяет ABI, Я думаю, что его машинная архитектура, которая определяет свой собственный конкретный ABI, исправьте меня, если я ошибаюсь. – AnkitSablok

+1

@Ankit, архитектура машины может ограничить возможные методы, но выбор сделан ОС. Рассмотрим, например, sysenter и int80 способы выполнения системных вызовов Linux на x86. Вы также можете использовать переменные стека или адреса фиксированной памяти для передачи параметров, а не с использованием регистров. – paxdiablo

+0

Архитектура машины только контролирует, как методы вызывается ядром, их число зависит от ядра ОС для этой архитектуры, я думаю – AnkitSablok

4

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

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

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

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

2

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

Смежные вопросы