64ビットプロセッサを搭載した32ビットOSに64ビットプログラムをインストールする


8

私は興味がある。64ビットプロセッサを搭載した32ビットOSに64ビットプログラムをインストールすることはできますか?

私はラズベリーpi 3でLinuxを実行していて、MongoDBの新しいバージョンをインストールしようとしています。

armv7l GNU/Linux
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian

1
代わりに64ビットOSの使用を検討してください。Raspbianは時代遅れです。64ビットのFedoraは、RPi3ですでに利用可能です
マイケルハンプトン

回答:


19

64ビットプロセッサを搭載した32ビットOSに64ビットプログラムをインストールすることはできますか?

原則的にはそうですが、プロセッサとOSはそれをサポートする必要があります。

ARMv8では、32ビット(Aarch32)カーネルは64ビット(Aarch64)プロセスを実行できません。これはプロセッサの制限です。

この制限のない他のプロセッサもあります。たとえば、x86_64プロセッサ上でx86_32カーネルの上でx86_64プロセスを実行することは可能ですが、ユーティリティが限られているため(ほとんどの場合、 32ビットにすることでカーネルのRAMのビット)。Linuxではサポートされていませんが、Solarisではサポートされています。

64ビットカーネルを実行している場合は、既存の32ビットOSを維持できます。Aarch64 LinuxカーネルはAarch32プロセスを実行できます。Raspbianはそのままではこれをサポートしていないため、32ビットOSと64ビットOSの両方を維持する必要があります。どちらかをメインOS(つまり、initおよびシステムサービスを実行するOS)として使用し、もう一方をchrootを使用して特定のプログラムを実行することができます。64ビットDebian / Ubuntuで32ビットプログラムを実行するにどうすればよいですか?を参照してください実用的なアプローチのために。

64ビットプログラムに必要なすべてのライブラリをインストールする必要があることに注意してください。特定のプロセスは完全に32ビットまたは完全に64ビットである必要があるため、64ビットの実行可能ファイルで32ビットのライブラリを使用することはできません。

32ビットシステムを維持する強い理由がない限り、64ビット実行可能ファイルを実行する必要がある場合は、64ビットシステムをインストールする方が簡単です。

64ビットプログラムで実行できるが32ビットプログラムでは実行できない唯一のことは、約3 GBを超える仮想メモリをアドレス指定することであることに注意してください。追加のより大きなレジスタからパフォーマンス上の利点を得ることができますが、追加のメモリアクセスからもパフォーマンスが失われます。


3
@Wildcard簡単に言えば、いつでも、プロセッサは32ビットモード(「Aarch32実行状態」)でAarch32命令を予期しているか、64ビットモードでAarch64命令を予期しているかのどちらかです。モードを切り替える唯一の方法は、プロセスとカーネル(またはカーネルとハイパーバイザー、またはハイパーバイザーとモニター)を切り替えることです。低い特権モードに切り替えると、32ビットから64ビットに切り替えることはできません。高い特権モードに切り替えると、常に以前のモードが復元されます。したがって、32ビットコードを64ビットコードよりも高い特権で実行するように調整することは不可能です。
Gilles 'SO-悪をやめる'

2
@Wildcard (続き)おそらくこの制限の理由は、Aarch64固有のプロセッサの状態が非常に多く、Aarch32コードがアクセスできないためです。たとえば、Aarch32カーネルはAarch64プロセスのレジスタを保存できません。
Gilles「SO-悪をやめる」

2
@ crellee、Gilles:64ビットのユーザーランドを持つ32ビットのカーネルの例を見つけるために、エキゾチックなOSを見る必要はありません。非常に人気のあるMac OS X 10.4 "Tiger"、10.5 "Leopard"、および10.6 "Snow Leopard"カーネルは、ほとんどすべてのMac用にK32構成で出荷され、Snow LeopardのK64の起動を許可されたいくつかのサーバーマシンを除いて、それらは64ビットのユーザーランドプロセスを実行できました(制限は徐々に少なくなっています)。
Iwillnotexist Idonotexist 2017

3
@Serge:286-> 386の説明は正しいです。32ビットのオペランドサイズを16ビットのリアルモードでプレフィックス付きで使用できます。デフォルトのオペランドサイズは16ですが、Intelはx86-64を開発していません。それはAMDでした(そのため、まだAMD64と呼ばれることもあります)。いいえ、32ビットモードで64ビットのオペランドサイズを使用することはできません。REXプレフィックスは、1バイトのinc/ decレジスタオペコード(0x40 .. 0x4F)を転用します。ロングモード(64ビットモード)では、デフォルトのオペランド・サイズは32であるが、デフォルトのアドレスサイズが64である
ピーターコルド

2
@ワイルドカード:IDK(互換モードのカーネル/ロングモードのユーザー空間が設計上の考慮事項である場合)。コンテキストスイッチの整数レジスタの状態を保存するには、Solaris(およびOS X)がr8-r15、およびrax-rsiの上半分にアクセスするためにロングモードである必要があります。IDK if xsave/ xrstorcompatモードの場合は、完全なベクトル状態も保存できます。そのため、十分にサポートされておら、明示的に提供されていません。おそらく、カーネルエントリポイントは64ビット(ロング)モードで実行され、残りのカーネルにジャンプする前に32ビット(互換)モードに切り替えます。(x86モードスイッチはaのみを取り、far jmpregには影響しません。)
Peter Cordes '12

5

一部のアーキテクチャでは、はい。ただし、ARMまたはx86では使用できません。

QEMUを使用して64ビットシステムをエミュレートすることもできますが、そうする必要はありません。


QEMUのようなエミュレーターを使用してmongoデータベースをインストールおよび実行するのは、惨事でしょうか?
crellee

非常に遅くなります。RPi3のRAMは1GBしかないので、価値はありません。代わりに32ビットパッケージをビルドすることを検討してください。
Ignacio Vazquez-Abrams 2017

2
カーネルがサポートしている場合は、x86の32ビットカーネル上で64ビットプログラムを実行できます。Linuxにはありませんが、Solarisにはあります。腕ではそれは不可能です。
Gilles「SO-邪悪なことをやめよう」

@ IgnacioVazquez-Abramsこれを試してください。遅いですが、致命的ではありません。主な理由は、qemuがユーザー空間でのみCPUエミュレーションを行うため、カーネル呼び出し(つまり、io待機時間)は同じままです。家庭用システムでは、楽しみのために、いくつかのツールにarmまたはmipsバイナリを使用するのが好きです:-)または、非常に大きなCPU負荷がない場合は、セキュリティが重要ではあるがCPUを集中的に使用しないツールで、バッファオーバーラン攻撃の確率を減らすためのエキゾチックなアーキテクチャ。
peterh-モニカを2017年

4

カーネルのみを64ビットカーネルにアップグレードすると、64ビットバイナリを実行できるようになります。基本的に、ディストリビューション全体を32ビットの互換モードで実行し、64ビットのmongodbのみが通常モードになります。

しかし、それはその価格に値しません。mongodbを32ビットに切り替えた方がよい。ただし、この場合、データベース全体を仮想メモリに直接マップするため、データベースを2GB以下にするという制限があります。データベースが大きい場合は、カーネルのアップグレードのみが残ります。(@duskwuffの拡張子に感謝!)

ところで、dbが非常に大きな負荷を必要としない場合、またはその前にキャッシングソリューションを使用できる場合(たとえば、別の32ビットmongoなど)、CPUエミュレーションが機能します。そのために、「qemu qemu-system-x86_64」のグーグルを開始します。そのような解決策はおそらく実行不可能な仕事の必要性を持ち、生産的な環境では奇妙であると考えられるかもしれませんが。

あなたの場所では、私のdbに十分な場合は32ビットのmongoを使用し、そうでない場合は64ビットのカーネルを使用します。


理にかなっていますが、mongodbを32ビットにどのように切り替えますか?
crellee

@crellee apt-get install mongodb:i386または類似の何か?
peterh-モニカを2017年

「パッケージmongodb:i386が見つかりません」エラーが
返され

1
32ビットのMongoDBを実行することは悪い考えです。データベースはメモリマップされているため、32ビットシステムで実行すると、データが2GB未満に制限されます。
duskwuff -inactive- 2017

はい、あなたはバージョン2.4.14に制限されていますが、これには多くの制限があります。
crellee

3

それは不可能ではありませんが、管理するのは本当に難しいと思います。そのため、32ビットOSは通常32ビットのみのバイナリーとライブラリーと共にパッケージ化(および受け入れ)されるため、64ビットのもので動作するようにシステムを大幅に調整する必要があります。

RPI3で直面する主な問題は、64ビットカーネルが不足していることです(少なくともraspbianでは)。

要するに、32ビットのバイナリを使用すれば大丈夫です。

編集:

64ビットカーネルを使用する場合は、ARM64アーキテクチャをサポートするディストリビューションをインストールする必要があります。ArchLinux ARM(こちら)をご覧くださいが、完全にはサポートされていません。

探している情報は、インストールタブの下部にあります。

また、公式のdebianポートを確認することもできますが、RPI3ポートには依然として大きな問題があるため、問題の価値があるかどうかを判断するのはあなた次第です。


問題は、CPUが(カーネルによって)32ビットモードで起動されるため、古い32ビットマシンのように見えることです。64ビットのレジスタと命令は使用できません。
JohanMyréen17年

1
そう、64ビットカーネルが必要なのはそのためです(Thomasが述べた)。
Stephen Kitt 2017

素敵な説明をありがとう。だから私のための解決策は私のRPI3に別のOSをインストールすることでしょうか?
crellee 2017

回答を更新しました。

@Thomas、一部のディストリビューションは、32ビットバリアントから始めて、32ビットと64ビットを組み合わせた操作をサポートしています。Debianは、少なくともx86での1つの例です。i386バリアントをインストールできます。これには64ビットのカーネルが含まれているため、64ビットのライブラリとバイナリもインストールできます。DebianでのARMのサポートはかかわらず、ARMシステムでこれを許可していません(ただし、組み合わせてインストールすることができますarm64し、armhfあなたが開始した場合、arm64)。
Stephen Kitt

1

私はかなり長い間、32ビットシステムで64ビットカーネルを使用してきました(これは、64ビットの実行可能ファイルをネイティブで実行するための最小要件と、必要なすべての64ビットライブラリです)。私はそれをお勧めしません。最終的に64ビットシステムホールセールにアップグレードしたのは、ALSAヘッダー、特にMidi ioctl呼び出しに関して、サイズにとらわれないという認識でした。つまり、32ビットモードでコンパイルされたものは、64ビットカーネルとうまく相互運用できません。

もちろん、これは修正に値するバグと見なすことができますが、ALSA開発のペースはほとんど凍結されており、混合プラットフォームのサポートが修正されるまで数年待つことはできませんでした(非混合の非バイナリ互換の方法で)。実行可能ファイル)混合プラットフォームへの関心が急速に減少している場合。

一部のアプリケーションでは混合モードで動作しますが(驚くほど実際には)、カーネルへのインターフェイスの基本的な共有以上のことを行っている場合、外部ライブラリを介しても、それは単に楽観的過ぎます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.