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 비트 커널은 데비안 32 비트에 설치할 수 있습니다. 패키지 페이지 에서 amd64 커널을 32 비트 데비안에서 사용할 수 있음을 알 수 있습니다 . 이것은 PAE 가능 커널을 사용하여 4G 이상의 총 RAM을 지원하는 대안으로 사용될 수 있습니다. 32 비트 바이너리는 여전히 프로세스 당 약 3G 이상의 RAM에 액세스 할 수 없습니다.


고마워! 당신의 대답은 수정 구슬처럼 분명합니다 ~ : D 데비안이 이전과 같이 커널 패키지를 다루는 것을 보지 못했습니다.
kiiwii

1
사실은 아닙니다. 32 비트 프로그램은 64 비트 커널에서 실행될 때 가상 주소 공간의 전체 4Gio를 사용할 수 있습니다 (ADDR_LIMIT_3GB 특성으로 실행하지 않는 한).
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 명령어 세트 (x386의 특정 버전을 엄격하게 말하고있는 i386 또는 i686이라고도 함 )도 지원합니다 . 동일은 간다 ARM 에 대한 A64 (새로운 64 비트 명령어 ARMv8에 나타나는 설정)과 A32 (이하 "고전"32 비트 명령어 세트의 이름) SPARC64SPARC , 나는 믿지 MIPS64MIPS . 따라서 이러한 모든 아키텍처 제품군에서 프로세서가 64 비트 코드를 실행할 수 있으면 32 비트 코드도 실행할 수 있습니다.

Linux 커널은 64 비트 커널로 32 비트 사용자 랜드 코드 실행을 지원합니다 (위에서 언급 한 모든 아키텍처 제품군에서 생각합니다). 커널은 동종 (모든 64 비트 또는 모든 32 비트)이어야하고 각 프로세스는 동종이어야하지만 64 비트 커널에서 32 비트와 64 비트 프로세스를 혼합하여 사용할 수 있습니다. 반대는 불가능합니다. 32 비트 커널에서는 64 비트 프로세스를 실행할 수 없습니다.

이는 64 비트 설치에서 기존 32 비트 바이너리를 실행하려는 동기로 인해 Linux에서 설계 선택 사항입니다. 다른 유닉스 변종들도 다른 선택을했다 : 솔라리스는 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/initinit프로그램이 컴파일 된 아키텍처를 알려줍니다 . 설치시 32 비트 및 64 비트 실행 파일을 혼합 할 수 있지만 일반적으로 모든 핵심 OS 프로그램은 관리하기가 훨씬 쉽기 때문에 동일한 아키텍처에서 제공됩니다.

$HOSTYPEbash 변수이며 bash프로그램이 컴파일 된 아키텍처를 알려줍니다 .

getconf LONG_BIT기본 C 컴파일러가 32 비트 또는 64 비트 프로그램을 컴파일하도록 설정되어 있는지 알려줍니다. 보다 정확한 테스트는 a를 인쇄하고 인쇄하는 프로그램을 실행하는 것입니다. sizeof(void*)또는 sizeof(size_t)호출 getconfgetconf기본 컴파일러라고 생각 하는 것에 대한 정보 만 제공 할 수 있습니다 .


1
실제로 32 비트 Solaris가 64 비트 프로세스로 전환 한 다음 다시 64 비트 모드로 전환됩니까? 이것은 큰 오버 헤드를 가져야하며 의미가 없습니다. 커널은 실제로 64 비트이기 때문입니다.
Ruslan

1
@Ruslan 왜 오버 헤드가 크나요? 컨텍스트 스위치의 전환 모드는 비용이 많이 들지 않습니다 (아무것도 x86을 낮은 수준에서 충분히 알지 못합니다). 커널은 32 비트 : 커널 매핑을위한 32 비트 가상 주소로, 32 비트 명령어 세트를 사용합니다.
Gilles 'SO- 악마 그만'

1
커널은 64 비트 인식 페이지 테이블 이상인 64 비트 앱을 지원하기 위해 64 비트 특정 데이터 구조를 유지해야합니다. 이것은 실제로 32 비트 커널이 아닙니다. 나는 실제로 amd64 arch에 깊이 들어 가려고하지는 않았지만 64 비트 지원을 끄면 특별히 설계된 호환성 모드를 사용하는 것과 비교하여 상당한 오버 헤드가 발생한다고 생각합니다.
Ruslan

1
@Ruslan 64 비트 인식 페이지 테이블 만 필요하며 실제로 필요한 비용은 매우 적습니다. 올바른 커널 디자인으로 다른 모든 것을 피할 수 있습니다. 필자는 솔라리스 커널을 파헤쳐 본 적이 없으며, 충분히 유연하게 만들 수 있다고 가정합니다 (SPARC64에 대한 사전 경험이 있음).
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.