x86-64 Linux에는 32비트 애플리케이션을 실행하기 위한 두 가지 옵션이 있습니다. 하나는 옵션을 통해 커널 자체에 구축할 수 있는 옵션 CONFIG_IA32_EMULATION
(대부분의 커널에 대해 켜져 있음)이고 다른 하나는 qemu-i386
.
차이점이 뭐야? 네이티브에 가까운 성능으로 실행할 수 있습니까 qemu-i386
? 네이티브에 가까운가요, 아니면 JIT 재컴파일러와 더 비슷합니까?
답변1
커널 구성 옵션CONFIG_IA32_EMULATION
x86-64 커널에 대한 32비트 바이너리 실행을 지원할 수 있는 가능성을 제공합니다.
이 지원에는 주로 다음이 포함됩니다.
- i386 시스템 호출에 대한 진입점을 제공합니다. (i386과 x86_64는 시스템 호출 번호가 다릅니다.) 32비트 매개변수를 64비트로 변환합니다.
- 32비트 ELF 파일 구조를 따르도록 ELF 로더(
fs/binfmt_elf.c
실행을 시작하기 위해 파일 시스템에서 프로세스의 주소 공간으로 실행 파일을 로드하는 역할)를 해킹합니다.
그런 다음 32비트 바이너리와 커널 사이에 추가 레이어를 추가하지 않고도 32비트 바이너리를 실행할 수 있습니다.
일부심각한 취약점의 역사는 짧습니다.(모두 세심하게 수리했지만...아무도 모릅니다)
qemu-i386(요청하신대로 vg아니요qemu-system-i386)은사용자 공간 에뮬레이터. 즉, 사용자 모드에서 실행되며 커널에서 특별한 32비트 지원을 요구하지 않고 내부적으로 32비트 프로그램을 로드하고 32비트 시스템 호출을 64비트 시스템 호출로 변환하는 등의 작업을 담당합니다.
이 주요 차이점(사용자 공간에서 실행되는 추가 레이어)으로 인해 qemu-i386(Wine을 통해 Windows 프로그램을 실행하는 것을 생각해 보세요)을 사용하면 기본 성능에 가까운 곳에서는 기대할 수 없습니다. 이는 동적으로 링크된 실행 파일과 요구 사항을 추가합니다. 32비트 응용 프로그램을 디버그하려면 특수 도구가 필요합니다.
qemu에 대한 다음 OP 재판본을 편집합니다.
네이티브와 비슷합니까, 아니면 JIT 재컴파일러와 비슷합니까?
우리가 읽을 수 있듯이번역기 내부 구조, qemu는 다음을 기반으로 하는 도구입니다."마이크로 코드 생성기"백엔드로서 이는 (추상) 코드 생성기에 지나지 않습니다.
이 추상 코드는 어느 정도 최적화된 대상별 기계어 코드로 변환되므로 추상 코드가 컴파일되었다고 합니다.
따라서 우리는 기본(코드 실행)보다 일종의 JIT 컴파일러(코드)에 더 가깝습니다...하지만..."시기 적절한"의문을 받을 수도 있습니다... ;-)