System Programming/Hypervisor
QEMU 코드 분석 #9 블록 디바이스 가상화 — QEMU 백엔드 (virtio-blk 클래스 생성 & 디스크 열기)
QEMU에서 블록 디바이스(virtio-blk)가 가상화되는 과정디스크 장치 가상화 방식(전/반/하드웨어 보조)과 virtio 원리,QEMU 초기화 단계의 virtio-blk 클래스 생성·인스턴스화·realize,QEMU 시작 과정에서 `-drive` 옵션이 실제 디스크 이미지 파일을 여는 데까지(drive_new → blockdev_init → bdrv_open → qcow2/raw)를 추적 1) 디스크 장치 가상화 방식과 virtio 원리2) QEMU 초기화 단계: virtio-blk 클래스 생성과 realize3) QEMU 시작 과정: -drive 파싱과 drive_new4) 디스크 이미지 열기 (bdrv_open → qcow2/raw) 1) 디스크 장치 가상화 방식과 virtio 원리디스크 장치 ..
QEMU 코드 분석 #8 VirtIO 디바이스 초기화— 게스트 커널 드라이버 로딩 & virtqueue 설정
게스트 커널에서 virtio 드라이버가 로딩·초기화되는 과정과 virtqueue 생성 1) 게스트 커널의 virtio 드라이버 로딩 (디바이스 리셋 ~ DRIVER_OK)2) virtio_pci_probe (pci_enable_device → legacy/modern → register_virtio_device)3) virtqueue 설정 (init_vqs · find_vqs · setup_vq · vring_create_virtqueue) 게스트 커널의 virtio 드라이버 로딩virtio 드라이버 로딩 과정일반적으로 virtio 드라이버가 디바이스 하나를 초기화하는 과정은 다음과 같다. (1) 디바이스 리셋이건 지난번에 설명한 register_virtio_device 함수에서 dev->config-..
QEMU 코드 분석 #7 VirtIO 디바이스 초기화 — QEMU 백엔드 realize & device_plugged
virtio 디바이스(balloon 예시)가 QEMU에서 realize되어 virtio 버스와 PCI 대리 디바이스에 연결되는 과정 1) QEMU virtio realize 호출 체인2) virtio_device_realize 와 virtio_balloon_device_realize3) virtio_bus_device_plugged 와 virtio_pci_device_plugged 1) QEMU virtio realize 호출 체인 (balloon 예시)virtio-balloon 장치가 만들어질 때 realize 함수가 상속 체인을 따라 연쇄 호출된다.virtio_balloon_pci_realize (VirtioPCIClass 레벨) ↓ 안에서 parent의 realize 호출virtio_pci_r..
QEMU 코드 분석 #6 VirtIO 기초 & 데이터 구조
전가상화·반가상화 비교, virtio의 기본 원리와 프레임워크(프론트엔드/백엔드/virtqueue), virtio 장치의 타입 계층과 초기화, VirtIO-PCI 초기화와 게스트 커널의 PCI 매거(enumeration) 흐름, virtqueue/vring(Descriptor Table, Available Ring, Used Ring)의 데이터 구조 1) virtio 개념과 기본 원리2) virtio 프레임워크와 장치 초기화 (타입 계층)3) VirtIO-PCI 초기화와 PCI 매거 흐름4) virtio 데이터 구조 (virtqueue · vring · Descriptor/Avail/Used Ring) 1) virtio 개념과 기본 원리가상머신 입장에서 보면, CPU랑 메모리를 가상화하는 것 외에도 당연..
QEMU 코드 분석 #5 PCI 디바이스 에뮬레이션 & 인터럽트
1) PCI 디바이스 소개2) PCI 디바이스 에뮬레이션 (pci_qdev_realize) 3) edu 디바이스: BAR 등록과 MMIO 읽기/쓰기4) Northbridge I/O 에뮬레이션5) SeaBIOS의 BAR 베이스 주소 설정6) PCI 디바이스 인터럽트 1) PCI 디바이스 소개PCI는 외부 디바이스를 연결하는 데 쓰이는 일종의 local 버스인데, 주요 기능은 외부 디바이스를 연결하는 거다.PCI 버스 규격은 20세기 90년대에 제기된 이후로 점차 다른 여러 버스들을 대체했고, 각종 프로세서에서 다 지원하게 됐다.지금까지도 PCI 버스랑 거기서 발전된 PCIe 버스가 PC에서 광범위하게 쓰이고 있다. 리눅스 시스템에서 lspci 명령어를 입력하면 현재 시스템의 PCI 디바이스를 볼 수 있다$..
QEMU 코드 분석 #4 Machine & i440fx
1) i440fx 칩셋과 에뮬레이션 메인보드 아키텍처 (qtree)2) 가상머신 초기화 (DEFINE_I440FX_MACHINE)3) Machine 메커니즘 큰 그림 (type_init ~ type_register)4) select_machine → MachineState 생성 (상세 추적)5) 함수 추적 — 다른 시각의 분석 1) i440fx 칩셋과 에뮬레이션 메인보드 아키텍처Intel 440FX는 Intel이 1996년에 발표한 Pentium II를 지원하기 위한 메인보드 칩으로, 지금까지 이미 20여년의 역사를 가졌으며, 한 세대를 풍미한 비교적 고전적인 아키텍처다. 비록 QEMU가 이미 더 진보한 q35 아키텍처의 에뮬레이션을 지원할 수 있지만, 현재 QEMU는 여전히 i440fx 아키텍처를 기본..
QEMU 코드 분석 #3 메모리 가상화 & 메모리 초기화
1) 메모리 가상화 개념 (GVA/GPA/HVA/HPA, 섀도우 페이지 테이블, EPT)2) 핵심 자료구조 (AddressSpace, MemoryRegion, RAMBlock, FlatView, FlatRange)3) 메모리 초기화 메인 라인 (pc_init1 메모리 분할 → cpu_exec_init_all → memory_map_init → memory_region_init → address_space_init)4) 메모리 flattening (address_space_update_topology → generate_memory_topology → render_memory_region → flatviews_init / GHashTable)5) listener (address_space_set_flatv..
QEMU 코드 분석 #2 KVM CPU가상화
1) CPU 가상화 개념 (VMX, VMCS)2) x86 가상화의 장애와 VMX 동작 (shadow PT, EPT, VM Entry/Exit)3) VCPU 생명 주기4) KVM 개요와 소스 코드 조직5) KVM 모듈 초기화 (vmx_init / kvm_init / irqfd)6) QEMU/KVM API 사용 예제 (light-qemu) 1) CPU 가상화 개념 (VMX · VMCS)물리 머신에서는 운영체제도 응용 프로그램도 모두 하드웨어 위에서 직접 실행된다.x86 CPU를 예로 들면, 총 ring0~ring3 네 개의 실행 등급이 있다. 운영체제는 프로그램을 두 종류로 나누는데, 즉 방금 말한 사용자 모드 프로그램(응용 프로그램)과 커널 모드 프로그램(커널 코드, 드라이버 프로그램 등)이다.커널 모드와..
QEMU 코드 분석 #1 파라미터 해석 · 모듈 초기화 · QOM · 속성
QEMU 명령행 파라미터가 어떻게 파싱되는지, 모듈 초기화(type_init)와 QOM(QEMU Object Model)의 타입 등록·초기화·계층 구조, 객체 생성과 초기화, 속성 1) QEMU 파라미터 해석2) main 함수와 모듈 초기화 (type_init / type_register)3) QOM — 타입의 등록·초기화·계층4) QOM — 객체의 생성과 초기화5) 속성 (Property 와 ObjectProperty) 1) QEMU 파라미터 해석 QEMU 소스코드를 분석하려면, 먼저 QEMU의 command line부터 시작해야 한다. $ qemu-system-x86_64 -enable-kvm -m 8G -smp 4 -boot once=d -drive file=./Ubuntu22.img -cdrom ..