Solaris 64 ビット 開発ガイド

第 3 章 32 ビットと 64 ビットインタフェースの比較

「4G バイト境界を超える」で説明したように、ほとんどの 32 ビットアプリケーションは、変更しなくても Solaris 64 ビットオペレーティングシステムで動作します。アプリケーションによっては、64 ビットアプリケーションとして再コンパイルのみが必要なものや、変換する必要があるものもあります。この章では、アプリケーションを再コンパイルしたり、64 ビットに変換する必要がある開発者向けに、「4G バイト境界を超える」で述べた項目に基づいて説明します。

アプリケーションプログラミングインタフェース

64 ビットオペレーティング環境でサポートされている 32 ビットアプリケーションプログラミングインタフェース (API) は、32 ビットオペレーティング環境でサポートされている API と同じです。したがって、32 ビットアプリケーションを 32 ビットと 64 ビットの環境間で変更する必要はありません。ただし、64 ビットアプリケーションとして再コンパイルする場合には修正作業が必要な場合があります。64 ビットアプリケーション用にコードを修正するためのガイドラインについては、第 4 章「アプリケーションの変換」を参照してください。

デフォルトの 64 ビット API とは、基本的に UNIX 98 ファミリーの API です。その仕様は、派生型を使って書かれています。64 ビットバージョンは、それら派生型のいくつかを 64 ビットに拡張することで作られています。これらの API を使って正しく書かれたアプリケーションは、32 ビットと 64 ビット間でソースを移植できます。Solaris 10 では UNIX 2001 API ファミリーも使用できます (standards(5) を参照)。

アプリケーションバイナリインタフェース

SPARCTM V8 ABI は、既存のプロセッサ固有のアプリケーションバイナリインタフェース (ABI) で、32 ビット SPARC バージョンの Solaris 実装はこのインタフェースに基づいています。SPARC V9 ABI は、SPARC V8 ABI を拡張して 64 ビット動作をサポートし、拡張アーキテクチャの新しい機能を定義しています。詳細は、「SPARC V9 ABI の特徴」を参照してください。

i386 ABI はプロセッサ固有の ABI で、32 ビットバージョンの Solaris (x86 プラットフォーム版) はこのインタフェースに基づいています。

Solaris 10 リリースでは、x86 システム上の 64 ビットバージョンの Solaris はプロセッサ固有の ABI である amd64 ABI に基づいています。amd64 ABI は 64 ビット動作をサポートし、新しいアーキテクチャの新しい機能を定義しています。64 ビット ABI を使用するプログラムは、32 ビットのプログラムより動作が優れることがあります。amd64 ABI をサポートするプロセッサは i386 ABI もサポートします。詳細は、「AMD64 ABI の特徴」を参照してください。

32 ビットアプリケーションと 64 ビットアプリケーション間の互換性

以降の節では、32 ビットと 64 ビットアプリケーション間のさまざまなレベルの互換性について説明します。

アプリケーションバイナリ

既存の 32 ビットアプリケーションは、32 ビットまたは 64 ビットのどちらのオペレーティング環境でも実行できます。唯一の例外は、libkvm/dev/mem/dev/kmem、または /proc を使用するアプリケーションです。詳細は、「4G バイト境界を超える」を参照してください。

アプリケーションソースコード

32 ビットアプリケーションに対しては、ソースレベルの互換性が維持されています。64 ビットアプリケーションについては、アプリケーションプログラミングインタフェースに使用される派生型に変更が加えられています。派生型およびインタフェースを正しく使用しているアプリケーションは、32 ビットに対してソースレベルで互換性があり、より容易に 64 ビットに移行することができます。

デバイスドライバ

32 ビットデバイスドライバは、64 ビットオペレーティングシステムでは使用できないため、32 ビットデバイスドライバは、64 ビットオブジェクトとして再コンパイルしなければなりません。さらに、64 ビットドライバは、32 ビットと 64 ビットの両方のアプリケーションをサポートしなければなりません。64 ビットオペレーティング環境に提供されているドライバはすべて、32 ビットと 64 ビットの両方のアプリケーションをサポートします。ただし、基本ドライバモデル、および DDI (Device Driver Interface) でサポートされているインタフェースに変更はありません。必要な作業は、LP64 データ型モデルの環境で適切となるようにコードを修正することです。詳細は、『Writing Device Drivers』を参照してください。

どちらの Solaris オペレーティングシステムが実行されているか

Solaris オペレーティングシステムは、2 つのアプリケーションバイナリインタフェース (ABI) を同時にサポートしています。言い換えれば、2 つの独立した、完全に機能するシステムコールパスが、64 ビットカーネルに接続されており、2 組のライブラリがアプリケーションをサポートします。

64 ビットオペレーティングシステムは、64 ビット CPU ハードウェア上でのみ動作しますが、32 ビットオペレーティングシステムは、32 ビットと 64 ビットのどちらの CPU ハードウェア上でも動作します。Solaris の 32 ビットと 64 ビットのオペレーティング環境は同じように見えるので、特定のハードウェアプラットフォーム上でどちらのバージョンが動作しているかすぐに判断できないことがあります。

isainfo コマンドを使用すると、システムで実行されているバージョンを簡単に確認できます。この新しいコマンドは、システムでサポートされているアプリケーション環境に関する情報を出力します。

次に示すのは、64 ビットオペレーティングシステムが実行されている UltraSPARCTM システムで実行した isainfo コマンドの出力例です。


% isainfo -v
64-bit sparcv9 applications
32-bit sparc applications  

32 ビット Solaris オペレーティングシステムが実行されている x86 システムで同じコマンドを実行した場合は、次のように出力されます。


% isainfo -v
32-bit i386 applications

64 ビット Solaris オペレーティングシステムが実行されている x86 システムで同じコマンドを実行した場合は、次のように出力されます。


% isainfo -v
64-bit amd64 applications
32-bit i386 applications

注 –

64 ビットカーネルを実行できない x86 システムもあります。そのシステムで Solaris オペレーティングシステムを実行する場合、カーネルは 32 ビット モードで実行されます。


isainfo(1) コマンドの便利なオプションとして -n があり、実行中のプラットフォームのネイティブ命令セットを出力できます。


% isainfo -n
sparcv9

-b オプションを使用すると、対応するネイティブのアプリケーション環境のアドレス空間のビット幅を、次のように出力できます。


% echo "Welcome to "`isainfo -b`"-bit Solaris"
Welcome to 64-bit Solaris

64 ビット機能があるかどうかを判定することによって、以前のバージョンの Solaris オペレーティングシステムで実行しなければならないアプリケーションであるかどうかを判断することができます。uname(1) で OS のバージョンを調べるか、または /usr/bin/isainfo が存在するかどうかを調べます。

関連コマンドの isalist(1) は、シェルスクリプトで使用するのに適しており、プラットフォームでサポートされている命令セットをすべて出力するのに使うことができます。ただし、命令セットの拡張の数が増加するに従い、すべてのサブセットを一覧表示することの限界が明らかになっています。今後、このインタフェースに依存しないようにしてください。

命令セットの拡張に依存するライブラリを作成するには、ダイナミックリンカーのハードウェア機能を使用します。isainfo コマンドを使用して、現在のプラットフォーム上の命令セットの拡張を確認します。


% isainfo -x
amd64: sse2 sse fxsr amd_3dnowx amd_3dnow amd_mmx mmx cmov amd_sysc cx8 tsc fpu
i386: sse2 sse fxsr amd_3dnowx amd_3dnow amd_mmx mmx cmov amd_sysc cx8 tsc fpu