2011-01-27 23 views
18

このウィキペディアが言うことである:コンピュータソフトウェアでABI(Application Binary Interface)とは何ですか?

、アプリケーション バイナリインタフェース(ABI)が アプリケーション(または任意の種類の)間 低レベルのインタフェースを記述したプログラム とオペレーティングシステムまたは別の アプリケーション。

ABIは、データタイプ、 サイズ、アラインメントなどの詳細をカバーしています。 規約は、 関数の引数がどのように渡され、 戻り値が取得されるかを制御します。システム コール番号とアプリケーション が オペレーティングシステムへのシステムコールを行う方法。 の完全なオペレーティングシステムABIの場合は、オブジェクトファイルの バイナリ形式、プログラム ライブラリなどがあります。完全ABI、インテルバイナリ互換 標準(のiBCS)として 、ABIは、任意の他のそのようなシステムの修正 せずに実行する を支持するのオペレーティングシステムからプログラム は、必要な共有ライブラリが 存在すること を提供可能同様の前提条件は です。

ABIは規約または標準であり、コンパイラ/リンカはこの規約を使用してオブジェクトコードを生成すると思います。そうですか?もしそうなら、誰がこれらの慣習を作ったのですか(企業か組織か)? ABIがないときはどうだった?私たちが参照できるこれらのABIに関する文書はありますか?

+7

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

答えて

12

あなたはABIの定義について、一点までは正しいです。古典的な例は、Linux(および他のUNIX)のsyscallインタフェースです。

これらは、コードがオペレーティングシステムに特定の任務を実行するよう要求する標準的な方法です。

このように、OSを書いた人、または後でsyscallsが追加された場合は、OSを追加した人(OSが許可している場合)によって決定されます。たとえば、x86のLinux syscallインターフェイスでは、にsyscallの数値をロードし、他のパラメータはのsyscallに応じて、ebxecxなどに配置されます。

通常、インターフェイスの作業を行うコンパイラやリンカではなく、使用している言語用のライブラリです。

Linuxに戻って、GNU Cライブラリにはfopenなどのコードが含まれており、最終的に関連するsyscallが呼び出され、下位レベルのタスク(システムコール番号5、open)が実行されます。 syscallsのリストはthis PDF fileにあります。

+0

私はABI、私はそれが自分の特定のABIを定義するマシンアーキテクチャは、私が間違っている場合は私を修正すると思います。 – AnkitSablok

+1

@Ankitでは、マシンアーキテクチャは可能な方法を制限することができますが、選択はOSによって行われます。例えば、x86上でLinuxシステムコールを実行するsysenterとint80の方法を考えてみましょう。レジスタを使用するのではなく、スタック変数または固定メモリアドレスを使用してパラメータを渡すこともできます。 – paxdiablo

+0

マシンアーキテクチャは、メソッドがカーネルによってどのように呼び出されるかを制御するだけであり、それらの数は、私が推測するアーキテクチャのOSカーネルに依存します – AnkitSablok

4

仕様は広く定義されていますが、規約は明確に定義されていますが、規約は慣習よりも適しています。

あなたは正しいです。仕様は標準化団体によって作成されています。Windowsとコンパイラ/ gccのようなコンパイラ/ビルドツールチェーンでサポートされているPOSIX仕様を見てみましょう。これは、OSがそれに従うことを前提としていますし、Linuxカーネルでさえそれに部分的に(ほぼ正確に)

ABIの前に?今日でも、セットトップボックスや組込みシステムを搭載した他のデバイス向けに、新しいチップが登場するにつれて、ファームウェアが手作業で作られています。

ドキュメントは、アセンブリ言語でプログラミングされるチップと高級言語用のデータシートのデジタルロジックコンテンツであり、クロスコンパイラのツールチェインのドキュメントは、ABIに含めるべき仮定を示しています。

2

ABIのコンセプトは、他のオペレーティングシステムやマシンアーキテクチャ上でのプログラムのバイナリ互換性をサポートすると考えられていたようです。したがって、x86アーキテクチャ上で動作するいくつかのオペレーティングシステムディストリビューションでプログラムを作成したとします。今、プログラマーにとって最も重要なことは、あなたがあなたのマシンに書いたこのプログラムは、同じアーキテクチャまたは異なるアーキテクチャ上で動いている他のマシン上でまったく同じように動くことができなければならないということです。 i386アーキテクチャでは、これはABIまたはアプリケーションバイナリインタフェースの概念が導入されている場所です。すべてのマシンアーキテクチャは、オペレーティングシステムのカーネルが外部世界、すなわちユーザ空間プログラムと話す独自の方法を定義しているため、システムコール、マシンレジスタ、それらのレジスタの使用方法、カーネルによってソフトウェア割り込みがどのように処理されるかなどが含まれます。 ABIは、コンパイル、リンク、バイトオーダリングなど、あなたのためにこれらのことを処理するものです。システム・プログラマーは、異なるアーキテクチャー上で稼働する同じオペレーティング・システムに対して統一されたABIを定義するのは難しいことです。そのため、すべてのマシン・アーキテクチャーには独自のアーキテクチャーがあり、プログラムをコンパイルしてそれらのマシンのフォーマットを確認する必要があります。

関連する問題