64ビットカーネルですが、すべての32ビットELF実行可能プロセスが実行されています。

64ビットカーネルですが、すべての32ビットELF実行可能プロセスが実行されています。

出力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

答え1

サポートされるすべてのプロセッサx64命令セット(x86_64またはamd64とも呼ばれます)は、以下をサポートします。x86命令セット(i386またはi686とも呼ばれ、厳密にはx86の特定のバージョン)。以下にも適用されます。A64(ARMv8に表示される新しい64ビット命令セット)とA32(「クラシック」32ビット命令セットの名前)スパック64そしてスパッキー、私は信じるMIPS64そしてMeaps。したがって、これらすべてのアーキテクチャスイートでプロセッサが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にこのフラグがある場合は、lm64ビットCPUです。

デフォルトuname -mまたはarchカーネルがコンパイルされたアーキテクチャを表示します。 Linuxはプロセスの「個性」を設定できます(次を使用)。personality)システムコール。次のコマンドを使用して、さまざまな属性で子プロセスを実行できます。setarchコマンドは、setarch i686 someprogram返された環境で指定されたプログラムを実行するか、返された環境linux32 someprogramで指定されたプログラムを実行します。uname -mi686setarch amd64 someprogramlinux64 someprogramuname -mamd64

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

$HOSTYPEbashプログラムがどのアーキテクチャに合わせてコンパイルされたかを示すbash変数です。

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

答え2

64ビットカーネルはDebian 32ビットにインストールできます。 amd64カーネルが32ビットDebianで利用可能であることがわかります。包装ページ。これは、PAE サポートカーネルを使用する代わりに、合計 4G 以上の RAM をサポートするために使用できます。 32ビットバイナリはまだプロセスあたり約3G以上のRAMにアクセスできません。

関連情報