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에 액세스할 수 없습니다.

관련 정보