32ビットコードが64ビット共有ライブラリを使用できないのはなぜですか?

32ビットコードが64ビット共有ライブラリを使用できないのはなぜですか?

GNU / Linux、x86 / x86-64では、通常(少なくとも時には例外がある可能性がある)32ビットプログラムで64ビットライブラリコードを使用できないのはなぜですか?

私はx86-64とx86の多くの違い、長いモード、拡張レジスタ、新しいレジスタ、セグメントの削除(ある程度)を知っています。

しかし、なぜそれが重要なのでしょうか?ロングモードの特権コードに関する変更は、カーネルモードで実行されない限り、システムライブラリには適用されません。

ユーザー領域の変更、より大きなレジスタ、新しいレジスタなどがなぜ重要ですか? 64ビットシステムでは、CPUはユーザースペースに入るとすでにロングモードで動作しており、この場合ロングモードは以前のバージョンと互換性があるため(保護モードに切り替えずに)32ビットモードビットを使用できる必要があります。ユーザー空間の64ビットコード。

ここで明らかなものを見逃していますか?

もちろん、64ビットライブラリに異なるAPIがある場合、または別の名前がある場合、たとえば実行すると、ldd32ビットライブラリとは異なる名前の共有ライブラリを探しているように見えることがあります。それは問題になります。それがすべてなら、解決策(パッチワークでも)はかなり簡単です。

x86-64 の呼び出し規則が通常の x86 と異なるため、ライブラリから関数を呼び出すことさえ問題になると想像できます。確かにこれは問題の一部ですか?

しかし、ここにはもっと良い理由があるはずだと思い、私が何か明らかなものを見逃しているようです。

ベストアンサー1

x86-64プロセッサは、独自の互換モードでのみ32ビットx86プロセッサと互換性がありません。長いモードのx86-64のほとんどの命令はia-32命令と同じであるため、レジスタの上半分を無視してある程度の互換性を得ることができます。ただし、違いがあり、いくつかのia-32コマンド(ショートジャンプなど)がx86-64ロングモードから削除されました。 64ビットおよび32ビットx86は、異なる命令セットを効果的に実装します。

プロセッサを互換モードに切り替えると、x86-64 CPUで32ビットコードしか実行できず、その逆も同様です。 32ビット互換モードで64ビットライブラリコードを呼び出すには、互換モードから64ビットロングモードに切り替える必要があります。モードはコードフラグメント記述子のビットによって決定されるため、ロングモードと互換モードのコードに対して別々のコードフラグメントを設定する必要があります。たとえば、互換モードでは、CPUは下位4 GBの仮想アドレス空間しか表示できないなど、いくつかの考慮事項があります。

おすすめ記事