![64비트 커널이지만 모든 32비트 ELF 실행 가능 프로세스가 실행되고 있습니다.](https://linux55.com/image/37584/64%EB%B9%84%ED%8A%B8%20%EC%BB%A4%EB%84%90%EC%9D%B4%EC%A7%80%EB%A7%8C%20%EB%AA%A8%EB%93%A0%2032%EB%B9%84%ED%8A%B8%20ELF%20%EC%8B%A4%ED%96%89%20%EA%B0%80%EB%8A%A5%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%8B%A4%ED%96%89%EB%90%98%EA%B3%A0%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
출력 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에 이 플래그가 있으면 lm
64비트 CPU입니다.
기본적으로 uname -m
또는 arch
커널이 컴파일된 아키텍처를 표시합니다. Linux는 프로세스의 "개성"을 설정할 수 있습니다(다음을 사용).personality
) 시스템 호출. 다음 명령을 사용하여 다양한 특성으로 하위 프로세스를 실행할 수 있습니다.setarch
명령은 setarch i686 someprogram
반환된 환경에서 지정된 프로그램을 실행하거나 linux32 someprogram
반환된 환경에서 지정된 프로그램을 실행합니다.uname -m
i686
setarch amd64 someprogram
linux64 someprogram
uname -m
amd64
file /sbin/init
init
프로그램이 어떤 아키텍처용으로 컴파일되었는지 알려줍니다 . 설치 시 32비트와 64비트 실행 파일을 혼합하는 것이 가능하지만 일반적으로 동일한 아키텍처에서 모든 핵심 운영 체제 프로그램을 관리하는 것이 더 쉽습니다.
$HOSTYPE
bash
프로그램이 어떤 아키텍처에 맞게 컴파일되었는지 알려주는 bash 변수입니다 .
getconf LONG_BIT
기본 C 컴파일러가 32비트 또는 64비트 프로그램을 컴파일하도록 설정되어 있는지 알 수 있습니다. 보다 정확한 테스트는 기본 컴파일러에 대한 정보 만 제공할 수 있는 인쇄 sizeof(void*)
또는 sizeof(size_t)
호출 프로그램을 컴파일하고 실행하는 것입니다.getconf
getconf
답변2
64비트 커널은 Debian 32비트에 설치할 수 있습니다. amd64 커널이 32비트 Debian에서 사용 가능한 것을 볼 수 있습니다.포장 페이지. 이는 PAE 지원 커널을 사용하는 대신 총 4G 이상의 RAM을 지원하는 데 사용할 수 있습니다. 32비트 바이너리는 여전히 프로세스당 약 3G 이상의 RAM에 액세스할 수 없습니다.