私が理解するように、POSIXはオペレーティングシステムが提供する必要があるAPIセットのみを指定し、実装の詳細、特にアセンブリレベルの互換性は指定しません。たとえば、x86では、POSIX APIを取得するにはシステムコールを使用する必要があります。
1. set `eax` to the syscall number
2. set syscall arguments
3. call int 0x80
ただし、プロセスは次のように大きく異なります。
- UNIXオペレーティングシステム:オペレーティングシステムごとに、システムコール番号からPOSIX APIへのマッピングが異なる場合があります。
- アーキテクチャ:X86 / armには他のコマンド呼び出しがあります。
int 0x80
だから私は、POSIXがさまざまなオペレーティングシステムでPOSIXライブラリのAPI変換を保存することによって私の役割を果たしていると思います。例えばglibc.so
:
POSIX API は glibc シンボル形式で提供されます。実行可能ファイルがPOSIX APIを呼び出すたびに、すべてのオペレーティングシステムでこのシンボルが見つかり、実行可能ファイルglibc.so
からint 0x80を直接呼び出す必要はありません。
だから私の質問は次のようになります
- 私の理解は正しいですか?
- これ以外にも同様に動作しますが、他のUNIXオペレーティングシステムで
glibc.so
動作する他のライブラリはありますか?glibc.so
答え1
POSIXバイナリインターフェイスが指定されていないため、「POSIX」バイナリをビルドして他のPOSIXスタイルのオペレーティングシステムで実行することはできません。 POSIXはシステムコールにも気にしません。関数を定義し、その関数が最終的にどこに実装されるかは重要ではありません。
実際に述べたように、Linuxや他のPOSIXスタイルのシステムでは、これらの機能は「Cライブラリ」で実装されています。しかし、バイナリがこれらの関数を呼び出すPOSIXを定義する方法さえありません。 Cプログラム用のPOSIXは最も関連性がありますが、プログラムを作成してコンパイルし、ランタイムシステムインターフェースの動作を考慮するときにはあまり重要ではありません。どのようにこれらのインターフェイスにアクセスします。c99
コマンド実行するコンパイラを指定するため、POSIXにはCソースコードを取得してそれをバイナリに変換する機能が必要ですが、そのバイナリの詳細はシステムによって異なります。 (Linuxのバイナリインタフェースは次のとおりです。システムV ABI、さまざまなアーキテクチャ固有の拡張機能が含まれています。 )
他のCライブラリもあります。各プラットフォームは独自の機能を提供し、一部のプラットフォームには2つ以上のプラットフォームがあります。 LinuxではGNU Cライブラリしかし、またマスラー。
また、CライブラリはCプログラムでのみ使用されるものではありません。 POSIXスタイルのシステムでは、ほとんどのコンパイラとインタプリタがそれを使用します。 (注目すべき例外には、独自のカーネルユーザースペースAPIインターフェースを実装するGoバイナリが含まれます。)