web-dev-qa-db-ja.com

32ビットと64ビットは連携できますか?

64ビットライブラリは32ビットアプリケーションで機能しますか?たとえば、私のアプリケーションGUIは32ビットQtを使用しています。そして私のビジネスコアは64ビットライブラリです。 OSは64ビットです。彼らはどのように一緒に働くことができますか?ありがとう。

18
user1899020

つまり、32ビットアプリを64ビットライブラリにリンクすることはできません。

64ビットOS(少なくともAMD、Intel、Sparcなどの一般的な32/64ビットプロセッサすべて)で32ビット共有ライブラリを使用して32ビットアプリケーションを実行できます。しかし、それはライブラリを含みません。

より長い答え:私は(郊外で)x86用の64ビットLinuxカーネルを設計したいくつかのチームに関与していました。技術的にこの作業を行う方法について、簡単に(プロジェクト全体と比較して、議論はかなり数時間続きました)いくつかの議論がありました。これを簡単にまとめると、64ビットには32ビットでは使用できないレジスタがあります。メモリアドレスとレジスタの余分な32ビットの問題もあります。ライブラリ自体が32ビット互換のライブラリであることを「認識」していれば、これらすべてを解決できます。しかし、基本的には32ビットライブラリとして記述された64ビットライブラリがあり、要点を失ってしまいました。

「より多くのレジスタ」は一部のプロセッサには適用されない場合がありますが、より大きなアドレス/ビット範囲のレジスタは、すべての32ビットおよび64ビット互換のプロセッサに確実に適用されます。また、64ビットの共有ライブラリまたは静的ライブラリを呼び出す32ビットコードを許可する単一のプロセッサを私は知りません。コードがそれに対処するように特別に書かれていない限り、それは機能しません。これは、32ビットアプリをサポートするための汎用64ビットライブラリを持つという目的を無効にします。

編集:

上記では、1つの実行可能ユニットのリンクについて説明しています。実行可能ファイル、共有ライブラリ、または静的ライブラリ。それはすべて「1ビット」である必要があり、32または64のいずれかです。

別のプロセスと通信するプロセス(たとえば、非GUIプロセスからのステータスを表示するGUIアプリ)が、2つのプロセスが同じプロトコルを使用している限り[通常、IPCとにかくポインタの受け渡しを許可しないので、32/64ビット変換はそれほど大きな問題ではありません]、32ビットのプロセスと64ビットのプロセスを持つことができます。

20
Mats Petersson

はい、しかしそれは大きな迷惑です。

まず、カーネルはライブラリとは異なります。通常、ライブラリはプロセスの仮想アドレス空間に表示されます。アドレス空間を独自のコードと共有します。ライブラリルーチンの呼び出しは、単にサブルーチン呼び出しです。

対照的に、カーネルにサービスを要求するには、プロセスが特別な命令を実行してトラップを生成します。このトラップにより、プロセッサは、プロセスのレジスタやその他の状態をメモリ(または通常はアクセスできない特別なプロセッサレジスタ)に保存したり、プロセッサのさまざまなモードを変更してカーネルに適したものにしたりするなど、いくつかの特別なことを実行します。カーネルの命令を指すようにプログラムカウンタを変更します。その後、カーネルが実行されます。この時点で、プロセスが32ビットモードで実行されているときに、カーネルが64ビットモードで実行されている可能性があります。ただし、カーネルはこれらの違いを認識するように設計されています。カーネルがプロセスを検査して要求内容を確認すると、プロセスが32ビットモードで実行されていることがわかっているため、情報とデータ構造が検索されます。カーネルは32ビットと64ビットの両方のプロセスをサポートでき、各タイプのプロセスを異なる方法で処理します。

もちろん、これは、使用している64ビットカーネルが32ビットプロセスをサポートしていることを前提としています。

通常、ライブラリを呼び出すときは、コードと同じモードにする必要があります。これは、通常のライブラリ呼び出しは単なるサブルーチン呼び出しであるためです。トラップは生成されず、プロセッサモードも変更されません。 32ビットプロセスから64ビットライブラリのルーチンを呼び出すことが非常に必要な場合は、ヘルパー64ビットプロセスを作成できます。 32ビットプロセスは、ライブラリ呼び出しの要求をパッケージ化し、何らかの形式のプロセス間通信によってその要求を64ビットヘルパープロセスに送信します。そのヘルパープロセスは、ライブラリルーチンを呼び出し、結果を送り返します。

当然、これは各ライブラリ呼び出しにかなりのオーバーヘッドを追加するため、大きなニーズがあり、より良い代替手段がない場合にのみ実行したいことです。

6

私はまさにこれを行うアプリケーションに取り組んでいます。アプリケーションコアはx64(およびQtを使用)ですが、一部の機器と通信する必要があります。このため、メーカーから32ビットライブラリしかありません。私が実装した方法は、コアとGUI用に64ビットの2つのアプリケーションと、機器を制御し、QSharedMemoryを使用してメインアプリケーションと通信する32ビットを使用することです。どちらのアプリもQtに基づいています(それぞれ64ビットと32ビット)。

2
Archie

Windowsで実行している場合、32b用にコンパイルされたアプリケーションはWindows 64bホストシステムで実行できます。64bWindowsに組み込まれている WOW64 サブシステムを確認してください。

そうは言っても、32b用にコンパイルされたコードと64b用にコンパイルされたコードをnot混合することはできません。つまり、32b用に構築されたライブラリは64bコードに対してリンクできず、その逆も同様です。 (さまざまな呼び出し規約、スタックフレームのレイアウト、アンワインドを除く...)

1
Jens