64ビットカーネルですが、すべての32ビットELF実行可能プロセスを実行していますが、どうですか?


9

からの出力uname

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

ただし、/sbin/init実行可能ファイルは32ビットとして表示されます。

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

システムの他の側面も同様に矛盾しているようです:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

回答:


13

64ビットカーネルは、Debian 32ビットにインストールできます。amd64カーネルが32ビットDebianで利用できることがパッケージページでわかります。これは、PAE対応のカーネルを使用して4G以上の合計RAMをサポートする代わりに使用できます。32ビットバイナリは、プロセスあたり約3Gを超えるRAMにアクセスできないことに注意してください。


THX!あなたの答えは水晶玉のように明確です〜:DこれまでのようにDebianがカーネルパッケージをこのように扱うことに気づいたことはありません。
kiiwii 14年

1
それは真実ではありません:32ビットプログラムは、64ビットカーネルで実行している場合(ADDR_LIMIT_3GBパーソナリティで実行している場合を除く)、仮想アドレス空間の4Gio全体を使用できます。
ysdx

@ysdxでは、2GBに制限することはWindows固有のものであり、0x80000000を超えるアドレスは32ビットのユーザー空間で許可されますか?
Paul Stelian

1
@ PaulStelian、32ビットWindowsでは、デフォルトで、レトロ互換性のために最低2GBの仮想メモリに制限されています(一部のプログラムは、特別な目的のために最高2GBの仮想メモリへのポインターを予約するために使用されたと思います)。実行可能ファイル(docs.microsoft.com/fr-fr/cpp/build/reference/…)でLARGEADDRESSAWAREフラグを設定して、オプトインして4GBの仮想メモリ全体にアクセスできるようにすることができます。
ysdx

15

x64命令セット(x86_64またはamd64とも呼ばれます)をサポートするすべてのプロセッサは、x86命令セット(i386またはi686とも呼ばれ、厳密には特定のバージョンのx86です)もサポートします。SPARC64SPARCのARM A64(ARMv8に登場する新しい64ビット命令セット)とA32(「クラシック」32ビット命令セットの名前)についても同じことが言えます。私はMIPS64MIPSを信じています。したがって、これらすべてのアーキテクチャファミリでは、プロセッサが64ビットコードを実行できる場合、32ビットコードも実行できます。

Linuxカーネルは、64ビットカーネルでの32ビットユーザーランドコードの実行をサポートします(上記のすべてのアーキテクチャファミリーで)。カーネルは同種(すべて64ビットまたはすべて32ビット)である必要があり、各プロセスは同種である必要がありますが、64ビットカーネルで32ビットと64ビットのプロセスを混在させることができます。逆は不可能です。32ビットのカーネルでは、64ビットのプロセスを実行できません。

これは、64ビットインストールで既存の32ビットバイナリを実行したいという欲求に動機づけられたLinuxの設計上の選択です。他のUnixバリアントは異なる選択をしました:Solarisは32ビットカーネルで64ビットプログラムを実行でき、その逆も可能ですが、OpenBSDは64ビットカーネルで32ビットプログラムを実行できません。

あなたは得ることができますCPUの情報では/proc/cpuinfo。x86 CPUにlmフラグがある場合、それは64ビットCPUです。

デフォルトでは、uname -mまたはarchカーネルがコンパイルされたアーキテクチャを示します。Linuxは、プロセスpersonalityコールの「パーソナリティ」をシステムコールで設定できます。setarchコマンドを使用して、別のパーソナリティでサブプロセスを実行できます。setarch i686 someprogramまたはlinux32 someprogramuname -m戻る環境で指定されたプログラムを実行するi686一方、setarch amd64 someprogramまたはlinux64 someprogramが戻る環境で指定されたプログラムを実行しuname -mますamd64

file /sbin/initinitプログラムがどのアーキテクチャ用にコンパイルされているかを示します。インストール内で32ビットと64ビットの実行可能ファイルを混在させることは可能ですが、通常、すべてのコアOSプログラムは同じアーキテクチャのものです。管理がはるかに簡単だからです。

$HOSTYPEbash変数であり、bashプログラムがコンパイルされたアーキテクチャを示します。

getconf LONG_BITデフォルトのCコンパイラが32ビットまたは64ビットのプログラムをコンパイルするように設定されているかどうかを通知します。より正確なテストは、をコンパイルして実行するプログラムです。印刷sizeof(void*)またはsizeof(size_t)—呼び出しでは、デフォルトコンパイラであると考えgetconfられるものに関する情報のみを提供できgetconfます。


1
確かに、32ビットSolarisは64ビットモードに切り替わり、64ビットプロセスに切り替わりますか?カーネルは事実上64ビットであるため、これには大きなオーバーヘッドが必要であり、意味がありません。
Ruslan

1
@Ruslanなぜそれは大きなオーバーヘッドがあるのでしょうか?コンテキストスイッチでのモードの切り替えはそれほどコストがかかりません(どちらかと言えば、低レベルのx86を十分に知りません)。カーネルは32ビットのままです。カーネルマッピング用の32ビット仮想アドレス、32ビット命令セットの使用。
Gilles 'SO-邪悪なことをやめなさい'

1
カーネルは、64ビットアプリ、少なくとも64ビット対応のページテーブルをサポートするために、64ビット固有のデータ構造をいくつか維持する必要があります。これは実際には32ビットカーネルではありません。私はamd64アーチに深く入り込もうとはしていませんが、64ビットサポートをオフに切り替えると、特別に設計された互換モードを使用する場合とは対照的に、かなりのオーバーヘッドが発生すると思います。
ルスラン

1
@Ruslan 64ビット対応のページテーブルのみで本当に必要であり、わずかなコストです。それ以外はすべて、適切なカーネル設計で回避できます。私はSolarisカーネルを掘り下げたことがありません。十分に柔軟になるように調整されていると思います(SPARC64の経験はありました)。
Gilles 'SO-邪悪なことをやめなさい'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.