QEMU 개요
QEMU
KVM을 공부하던 와중에 QEMU 관련해서 많이 등장했다.
이전에 OS 만들기 부분을 건드리면서도 QEMU를 이용해서 화면을 띄우긴 했었는데, 사실 QEMU가 뭐냐고 물으면 굉장히 대답할 말이 애매하므로 이 기회에 QEMU가 뭔지 명확하게 정리하고 가고자한다.
1. 개요
QEMU는 일반적이고 오픈 소스인 머신 에뮬레이터이자 가상화 프로그램이다.
에뮬레이터란 대상 CPU가 아님에도 대상 CPU의 특정 구조를 모사할 수 있는 프로그램을 말하는 것이다.
가상화란 전통적인 하나의 하드웨어에 하나의 OS를 구동하는 것이 아닌 각각의 OS에 대해 각각의 하드웨어가 있는 것처럼 모사하여 제공함으로써 하드웨어 사용률을 높이는 기술을 말한다.
총합해서 말하자면 QEMU는 다른 타겟 기기에서 구동되는 프로그램을 가져와 구동할 수 있는 프로그램이자 하나의 하드웨어를 추상화하여 각각의 OS에 제공가능한 프로그램이라고 할 수 있다.
독립적으로 사용할 경우 Guest OS를 구동하기 위해 전체(CPU, 메모리, 주변기기등)를 에뮬레이션 하고 번역하여 구동중인 OS에 전달하지만, kvm이나 xen과 같은 Hypervisor와 같이 사용되는 경우, 특정 Guest OS의 코드는 KVM과 같은 하이퍼 바이저를 통해 호스트 CPU에서 실행하는 형태가 된다. 아래와 같은 형태가 되는 것이다.
QEMU에서는 어떤 CPU에서 구동하기 위한 프로그램을 다른 CPU에서 실행할 수 있는데 전체 시스템을 에뮬레이팅하는 시스템 에뮬레이션과는 달리 CPU가 에뮬레이션된다. 이런 경우를 Binary Translation이라고 한다.
예를 들어 ARM CPU에서 구동되는 코드를 X86에서 구동하고자한다면 ARM 코드를 X86 코드로 번역해주는 것이다.
2. 지원 환경
1) Architecture
아래의 표는 QEMU가 지원하는 아키텍처이며, 어떤 가속기를 사용해서 지원하는지에 대한 표이다. 여기 나와있는 아키텍처를 제외하고는 지원되지 않는다.
CPU Architecture | Accelerators |
---|---|
Arm | hvf (64 bit only), kvm (64 bit only), tcg, xen |
MIPS (64 bit little endian only) | kvm, tcg |
PPC | kvm, tcg |
RISC-V | kvm, tcg |
s390x | kvm, tcg |
SPARC | tcg |
x86 | hvf (64 bit only), kvm, nvmm, tcg, whpx (64 bit only), xen |
※ 가속기 (Accelerators)
말만 들으면 가속기가 뭘 가속해준다는 것인가 싶다. 하지만 가속기가 이름이 가속기라고 붙은 이유가 있다. CPU에서 구동되야하는 코드를 에뮬레이터가 훨씬 더 빠르게 실행될 수 있도록 한다고 가속기라는 이름이 붙었다. 원래는 KQemu라는 가속기가 있었지만 현재는 KVM이나 Xen과 같은 하이퍼바이저가 가속기 역할을 하거나 TCG(Tiny Code Generator)라는 작은 코드 생성기가 그 역할을 하기 때문에 필요가 없어졌다.
2) OS
a. Linux
기본적으로 최초 릴리즈 이후 최대 5년동안 최신 주요버전을 지원한다. linux에 대한 지원을 위해 아래의 목록을 살핀다고 한다.
- CentOS
- Debian
- Fedora
- openSUSE
- RHEL
- SLES
- Ubuntu LTS
b. Windows
64bit만 지원하며 최신 버전 두 개를 지원하는 것을 목표로 한다. 2025년 2월 4일 기준 최소 지원 Windwos API는 windows 8이다.
C. Mac OS
Mac OS를 지원하기 위해 Homebrew와 Mac port를 사용한다.
3. QEMU의 코드 구조
1) accel
가속기에 대해 구현하는 디렉토리다. xen이나 kvm와 같은 하이퍼바이저를 지원한다.
2) block
블록 디바이스에 대한 코드이다.
3) chardev
문자 단위 입출력에 대한 코드이다.
4) crypto
암호화 루틴이 포함되어있다. (AES, HMAC, HASH등)
5) disas
지원하는 아키텍처의 디스어셈블 명령이 포함되어있다.
6) docs
QEMU를 설명하는 문서가 포함되어있다.
7) fpu
IEEE-754 부동 소수점 연산 함수가 구현되어있다. 내부적으로 부동소수점에 대한 사칙 연산 함수가 구현되어있다.
8) hw
x86이나 mips와 같은 특정 아키텍처의 에뮬레이션을 위한 코드가 있다. (CPU나 MMU, PC등 하드웨어 코드 포함)
9) target
QEMU 타겟 아키텍처를 지원하는 코드이다.
CPU의 세부사항의 정의와 명령어 집합을 TCG 중간 표현으로 번역하는 코드가 포함되어있다.
10) net
네트워크 계층에 사용되는 코드이다.
11) pc-bios
일반적인 PC 바이오스의 바이너리 이미지이다.
12) tcg
QEMU의 TCG(Tiny Code Generator)이다.
13) ui
디스플레이 드라이버, GTK+ GUI 등 유저 인터페이스에 관련된 코드이다.
※ 본 포스팅은 추가적으로 업데이트 될 예정이다.